
leetcode-用栈实现队列-27
发布日期:2021-05-04 18:21:48
浏览次数:23
分类:原创文章
本文共 2832 字,大约阅读时间需要 9 分钟。
题目要求
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false。
思路
因为本题是按照c语言来写的,因此需要自己写对于栈的相关功能的函数进行调用,由于栈是先进后出的,我们可以先构建上两个栈,第一个栈用来入栈,一次将所有的数据全部入栈之后,然后我们只要把第一个栈中的数据全部导入到第二个栈中,这样我们就可以把全部的数据逆序,然后只需要每次从第二个栈一个一个出栈,当第二个栈中的数据为空时,再重新引入第一个栈中的数据,如果两个栈中均没有数据,那么说明我们所建的队列为空。
代码实现
typedef int SLDataType;typedef struct SeqList{ SLDataType* a; int top; int capacity;}Stack;//栈的初始化void StackInit(Stack* pst);//栈的销毁void StackDestory(Stack* pst);//增加栈顶元素void StackPush(Stack* pst, SLDataType x);//移除栈顶元素void StackPop(Stack* pst);//返回栈中元素的数目int StackSize(Stack* pst);//返回栈顶元素SLDataType StackTop(Stack* pst);//栈内判空int StackEmpty(Stack* pst);//栈的初始化void StackInit(Stack* pst){ assert(pst); pst->a = (SLDataType*)malloc(sizeof(SLDataType)* 4); pst->top = 0; pst->capacity = 4;}//栈的销毁void StackDestory(Stack* pst){ assert(pst); free(pst->a); pst->a = NULL; pst->top = pst->capacity = 0;}//增加栈顶元素void StackPush(Stack* pst, SLDataType x){ assert(pst); if (pst->top == pst->capacity) { SLDataType* tmp = realloc(pst->a, pst->capacity * 2 * sizeof(SLDataType)); if (tmp == NULL) { printf("relloc fail\n"); exit(-1); } pst->a = tmp; pst->capacity *= 2; } pst->a[pst->top] = x; pst->top++;}//移除栈顶元素void StackPop(Stack* pst){ assert(pst); assert(!StackEmpty(pst)); pst->top--;}//返回栈中元素的数目int StackSize(Stack* pst){ assert(pst); return pst->top;}//返回栈顶元素SLDataType StackTop(Stack* pst){ assert(pst); assert(!StackEmpty(pst)); return pst->a[pst->top - 1];}//栈内判空int StackEmpty(Stack* pst){ assert(pst); return pst->top == 0 ? 1 : 0;}typedef struct { Stack popST; Stack pushST;} MyQueue;/** Initialize your data structure here. */MyQueue* myQueueCreate() { MyQueue* q = (MyQueue*)malloc(sizeof(MyQueue)); StackInit(&q->pushST); StackInit(&q->popST); return q;}/** Push element x to the back of queue. */void myQueuePush(MyQueue* obj, int x) { StackPush(&obj->pushST, x);}/** Removes the element from in front of queue and returns that element. */int myQueuePop(MyQueue* obj) { //1.如果为空 //2.如果不为空 if (StackEmpty(&obj->popST)) { while (!StackEmpty(&obj->pushST)) { StackPush(&obj->popST, StackTop(&obj->pushST)); StackPop(&obj->pushST); } } int top = StackTop(&obj->popST); StackPop(&obj->popST); return top;}/** Get the front element. */int myQueuePeek(MyQueue* obj) { if (StackEmpty(&obj->popST)) { while (!StackEmpty(&obj->pushST)) { StackPush(&obj->popST, StackTop(&obj->pushST)); StackPop(&obj->pushST); } } return StackTop(&obj->popST);}/** Returns whether the queue is empty. */bool myQueueEmpty(MyQueue* obj) { return StackEmpty(&obj->pushST) && StackEmpty(&obj->popST);}void myQueueFree(MyQueue* obj) { StackDestory(&obj->pushST); StackDestory(&obj->popST); free(obj); //置空也不会把实参置空,无意义}
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年04月03日 20时43分45秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
调度算法的一些评价指标
2019-03-04
配置环境变量的作用
2019-03-04
自学js第六天:JS数组和算法
2019-03-04
同步时序逻辑电路分析
2019-03-04
动态规划之有向图传递闭包的计算warshall算法图解详
2019-03-04
动态规划之背包问题
2019-03-04
ggplot2:数据分析与图形艺术第二版,11.4对模型可视化代码修改版
2019-03-04
R语言生成有标签的三维数组
2019-03-04
R语言做kaggle中California Housing Prices数据集
2019-03-04
观察者模式的理解以及在前端的广泛应用
2019-03-04
python,matplotlib中再添加一个y轴(在原来图上添加一个新的y轴)
2019-03-04
将图例放在最下面并且横向放置(ggplot2:数据分析与图形艺术6.4.4练习题第3题)
2019-03-04
联想拯救者突然连不上网怎么办
2019-03-04
vue中的一些高级特性(含vue3新特性)
2019-03-04
1361: [NOIP]数制转换
2019-03-04
c++的内存管理
2019-03-04
全排列(深度优先搜索+递归)
2019-03-04
linux各种软件的安装
2019-03-04
html和css导航条的创建
2019-03-04