用栈实现队列(力扣第232题)

#define _CRT_SECURE_NO_WARNINGS 1
#include "assert.h"
#include "stdio.h"
#include "stdbool.h"
#include "stdlib.h"
#include "string.h"
#define N 10
typedef int STDataType;
int data;
//静态栈
//typedef struct Stack {
//	STDataType _a[N];
//	int _top;//栈顶元素
//}Stack;

//动态栈
typedef struct ST {
	STDataType* _a;
	int _top;//栈顶元素
	int _capacity;//最大容量
}Stack;

//初始化栈
void StackInit(Stack *pst);

//入栈
void StackPush(Stack* pst, STDataType x);

//出栈
void StackPop(Stack* pst);

//获取栈顶元素
STDataType StackTop(Stack* pst);

//获取栈的有效元素个数
int StackSize(Stack* pst);

//判断栈是否为空,是返回1,非空返回0
bool StackEmpty(Stack* pst);

//打印栈同时销毁
void StackPrint(Stack* pst);

//销毁栈
void StackDestory(Stack* pst);


//初始化栈
void StackInit(Stack* pst)
{
	assert(pst);
	pst->_a = NULL;
	pst->_top = 0;
	pst->_capacity = 0;
}
//入栈
void StackPush(Stack* pst, STDataType x)
{
	assert(pst);
	if (pst->_top == pst->_capacity)
	{
		STDataType newcapacity = pst->_capacity == 0 ? 4 : (pst->_capacity * 2);
		STDataType* temp = (STDataType*)realloc(pst->_a, sizeof(STDataType) * newcapacity);
		if (temp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		pst->_a = temp;
		pst->_capacity = newcapacity;
	}
	pst->_a[pst->_top] = x;
	pst->_top++;
}

//出栈
void StackPop(Stack* pst)
{
	assert(pst);
	assert(pst->_top > 0);
	pst->_top--;
}

//获取栈顶元素
STDataType StackTop(Stack* pst)
{
	assert(pst);
	assert(pst->_top>0);
	return pst->_a[pst->_top-1];
}

//获取栈的有效元素个数
int StackSize(Stack* pst)
{
	assert(pst);
	return pst->_top;
}

//判断栈是否为空,是返回1,非空返回0
bool StackEmpty(Stack* pst)
{
	assert(pst);
	if (pst->_top == 0)
		return true;
	else
		return false;
}

//打印栈
void StackPrint(Stack* pst)
{
	while (!StackEmpty(pst))
	{
		printf("%d\n", StackTop(pst));
		StackPop(pst);
	}
}


//销毁栈
void StackDestory(Stack* pst)
{
	assert(pst);
	free(pst->_a);
	pst->_a = NULL;
	pst->_top = pst->_capacity = 0;
}

//队列先进先出,栈先进后出
typedef struct {
    Stack st1;
    Stack st2;
} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* pq=(MyQueue*)malloc(sizeof(MyQueue));
    if(pq==NULL)
    return NULL;
    StackInit(&pq->st1);
    StackInit(&pq->st2);
    return pq;
}

void myQueuePush(MyQueue* obj, int x) {
    if(StackEmpty(&obj->st1))
    {
        StackPush(&obj->st2,x);
    }
    if(StackEmpty(&obj->st2))
    {
        StackPush(&obj->st1,x);
    }
}

int myQueuePop(MyQueue* obj) {
  if(StackEmpty(&obj->st1))
    {
        while((&obj->st2)->_top!=1){
        StackPush(&obj->st1,StackTop(&obj->st2));
        StackPop(&obj->st2);
        }
        data=StackTop(&obj->st2);
        StackPop(&obj->st2);
        while((&obj->st1)->_top!=0){
            StackPush(&obj->st2,StackTop(&obj->st1));
            StackPop(&obj->st1);
        }
        return data;
    }
    else if(StackEmpty(&obj->st2))
    {
        while((&obj->st1)->_top!=1){
        StackPush(&obj->st2,StackTop(&obj->st1));
        StackPop(&obj->st1);
        }
        data=StackTop(&obj->st1);
        StackPop(&obj->st1);
         while((&obj->st2)->_top!=0){
            StackPush(&obj->st1,StackTop(&obj->st2));
            StackPop(&obj->st2);
        }
    }
        return data;
}

int myQueuePeek(MyQueue* obj) {
    if(StackEmpty(&obj->st1))
    {
        while((&obj->st2)->_top!=0){
        StackPush(&obj->st1,StackTop(&obj->st2));
        StackPop(&obj->st2);
        }
        data=StackTop(&obj->st1);
        while((&obj->st1)->_top!=0){
        StackPush(&obj->st2,StackTop(&obj->st1));
        StackPop(&obj->st1);}
        return data;
    }
    if(StackEmpty(&obj->st2))
    {
        while((&obj->st1)->_top!=0){
        StackPush(&obj->st2,StackTop(&obj->st1));
        StackPop(&obj->st1);
        }
         data=StackTop(&obj->st2);
        while((&obj->st2)->_top!=0){
        StackPush(&obj->st1,StackTop(&obj->st2));
        StackPop(&obj->st2);
        }
    }
    return data;
}

bool myQueueEmpty(MyQueue* obj) {
    if(StackEmpty(&obj->st1)&&StackEmpty(&obj->st2))
    return true;
    return false;
}

void myQueueFree(MyQueue* obj) {
    StackDestory(&obj->st1);
    StackDestory(&obj->st2);
    free(obj);
    obj=NULL;
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * MyQueue* obj = myQueueCreate();
 * myQueuePush(obj, x);
 
 * int param_2 = myQueuePop(obj);
 
 * int param_3 = myQueuePeek(obj);
 
 * bool param_4 = myQueueEmpty(obj);
 
 * myQueueFree(obj);
*/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/560042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【加密周报】中东“惊雷”炸响币圈!比特币减半成功完成,市场情绪已被提前消化!中美突传USDT重磅消息!

周五(4月19日),比特币经历惊魂一刻,伊朗核设施所处的中部城市伊斯法罕惊传爆炸,叙利亚与伊拉克也都传来爆炸声响,中东全面战争与核武攻击威胁触发加密市场恐慌情绪。比特币一度下探59600美元。但随后伊朗强调核设施未受损&#xf…

K8S哲学 - probe 探针

探针分类: liveness probe readiness probe startup probe Liveness Probe:用于检查容器是否还在运行。如果 Liveness Probe 失败,Kubernetes 会杀死容器,然后根据你的重启策略来决定是否重新启动容器。常见的做法是使用与 Readin…

vivado 在硬件管理器中调试 AXI 接口

在硬件管理器中调试 AXI 接口 IP integrator 中的 System ILA IP 支持您在 FPGA 上对设计执行系统内调试。在 Versal 器件上 , System ILA 核已被废 弃。现在 , 在含 AXIS 接口的标准 ILA 中支持接口调试。如需监控 IP integrator 块设计中的…

流媒体协议--RTMP

文章目录 RTMP播放基本流程TCP握手过程RTMP握手过程connect连接createStream 创建流play 播放命令deleteStream删除流RTMP数据组成 RTMP(Real Time Messaging Protocol)是一个应用层协议,主要用于在Flash player和服务器之间传输视频、音频、控制命令等内容。 该协议…

Flutter 热修复(Shorebird)

Shorebird:https://docs.shorebird.dev/ 我们都知道安卓原生开发,热修复已经不是什么难题。阿里云,腾讯云已经都有现成的SDK可以接入。 然而Flutter开发还一直没有类似热修复的开发库,无意中看到了Shorebird这个平台&#xff0c…

【电子通识】焊接的原理、技巧与注意事项

在【电子通识】烙铁使用方法 中我们讲到烙铁是硬件工程师最经常使用的工具之一,一把性能保持良好的烙铁能帮助我们快速进行电路调试。并且提供了一些与烙铁有关的周边知识、保养和使用注意事项等。 本文章是基于有技巧 !小姐姐带你玩焊接!进行…

短视频素材哪里去找?推荐几个视频素材免费下载的网站

高质量的资源,会让你的视频创作更加生动和具有吸引力。下面我为你介绍世界各地的优质无水印视频素材网站,以拓宽你的创作视野,帮助你在这个视觉革命的时代中脱颖而出。 1. 蛙学府(中国) 提供各种类别的优质高清视频素…

音视频封装格式解析(1)——H264格式简析,I/P/B帧是什么?H264压缩原理

文章目录 1. H264编码参数2. H264编码原理2.1 压缩原理2.2 编码结构解析 3. NALU结构4. H264 annexb模式5. 补充说明5.1 I帧5.2 P帧5.3 B帧 1. H264编码参数 视频质量和⽹络带宽占⽤是相⽭盾的。通常情况下,视频流占⽤的带宽越⾼则视频质量也越⾼,需要的…

继电器工作原理、主要选型参数及应用电路详解

继电器具有输入回路和输出回路,通常应用于自动控制电路中。继电器实际上是用较小的电流去控制较大电流的一种“自动开关”。 工作原理 继电器的工作原理基于电磁效应。电磁式继电器一般由铁芯、线圈、衔铁、触点簧片等组成。当线圈两端加上一定的电压时,…

CSS基础:盒子模型详解

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃,大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 We…

基于Kubernetes集群构建MongoDB

基于Kubernetes集群构建MongoDB 作者:行癫(盗版必究) 一:基础环境 1.Kubernetes集群正常运行 2.Harbor私有仓库正常运行 二:MongoDB项目部署 ​ MongoDB项目对应Kubernetes的yaml文件: --- apiVersion: v1 kind: Namespace metadata:name: m

揭开ChatGPT面纱(一):准备工作(搭建开发环境运行OpenAI Demo)

文章目录 序言:探索人工智能的新篇章一、搭建开发环境二、编写并运行demo1.代码2.解析3.执行结果 本博客的gitlab仓库:地址,本博客对应01文件夹。 序言:探索人工智能的新篇章 随着人工智能技术的飞速发展,ChatGPT作为…

ruoyi element-ui 实现拖拉调整图片顺序

ruoyi element-ui 实现拖拉调整图片顺序 安装sortablejs https://sortablejs.com/npm 安装sortablejs npm install sortablejs --save相关options var sortable new Sortable(el, {group: "name", // or { name: "...", pull: [true, false, clone, …

【大模型系列】大模型评价指标总结

文章目录 1 图生文 (Image-to-Text)1.1 BLEU:基于准确率,得分越高越好1.2 METEOR:基于准确率和召回率,得分越高越好1.3 ROUGE:得分越高越好1.4 CIDEr:得分越高越好1.5 SPICE:得分越高越好1.6 Hu…

【云计算】云数据中心网络(五):对等连接

《云网络》系列,共包含以下文章: 云网络是未来的网络基础设施云网络产品体系概述云数据中心网络(一):VPC云数据中心网络(二):弹性公网 IP云数据中心网络(三)…

OpenHarmony网络通信-socket-io

简介 socket.io是一个在客户端和服务器之间实现低延迟、双向和基于事件的通信的库。建立在 WebSocket 协议之上,并提供额外的保证,例如回退到 HTTP 长轮询或自动重新连接。 效果展示 下载安装 ohpm install ohos/socketio OpenHarmony ohpm 环境配置等更…

原始部落版本潮玩宇宙小程序定制大逃杀游戏APP开发H5游戏

原始部落版本潮玩宇宙小程序定制大逃杀游戏APP开发H5游戏 潮玩宇宙小程序定制大逃杀游戏APP开发H5游戏 潮玩宇宙大逃杀小游戏模块成品源码,可嵌入任何平台系统,增加用户粘性,消除泡沫,短视频直播引流。 玩家选择一间房间躲避杀手…

Vue3+Spring Boot3实现跨域通信解决办法

Vue3Spring Boot3实现跨域通信解决办法 1 跨域是什么?2 何为同源呢?3 解决办法3.1 全局配置3.1.1 实现CorsFilter过滤器3.1.2 实现SpringMVC配置类3.1.3 创建CorsFilterFactory工厂类返回CorsFilter对象 3.2 局部跨域3.2.1 注解配置3.2.2 手动设置响应头(局部跨域)…

Python | Leetcode Python题解之第37题解数独

题目: 题解: class Solution:def solveSudoku(self, board: List[List[str]]) -> None:def dfs(pos: int):nonlocal validif pos len(spaces):valid Truereturni, j spaces[pos]for digit in range(9):if line[i][digit] column[j][digit] bloc…

类和对象【二】this指针,构造函数和成员初始化列表【超详细】

文章目录 this指针this指针的定义this指针的“工作”原理this指针的作用this指针的特点 构造函数构造函数的定义构造函数的作用构造函数的特点构造函数的调用方式括号法无参构造或者全缺省构造需要传参才能调用的构造函数 隐式类型转换法是只传一个参数就能调用的构造函数是要传…