栈实现队列

 

用两个栈实现队列

题目链接

 

思路

首先, 梳理下栈和队列的概念, 如下图

栈中所有数据遵循后入先出, 而队列是先入先出

然后, 理解用两个栈模拟出的队列结构

最后思考如何用模拟出的队列实现入队, 出队, 取队头数据和判空操作, 这里说一下我的思路

入队: 入pushst栈

出队: 将pushst栈中的所有数据依次导入进popst栈中, 这样将popst栈顶数据出栈就实现了出队

取队头数据: 与出队类似,导入popst, 取popst栈顶数据就是取队头数据 

判空: 如果两个栈都为空,则队列为空

下面代码实现

typedef int STDataType;
typedef struct stack
{
STDataType* dys;
int capacity;
int top;
}stack;
// 初始化
void STInit(stack* ps);
// 销毁
void STDestroy(stack* ps);
// 入栈
void STPush(stack* ps, STDataType data);
// 出栈
void STPop(stack* ps);
// 取栈顶数据
STDataType STTop(stack* ps);
// 计算数据个数
int STSize(stack* ps);
// 判空
bool isSTEmpty(stack* ps);
// 初始化
void STInit(stack* ps)
{
assert(ps);
STDataType* tmp = (STDataType*)malloc(sizeof(STDataType) * 3);
if (NULL == tmp)
{
perror("STInit::malloc fail");
return;
}
ps->dys = tmp;
ps->capacity = 3;
ps->top = 0;
}
// 销毁
void STDestroy(stack* ps)
{
assert(ps);
free(ps->dys);
ps->dys = NULL;
ps->capacity = 0;
ps->top = 0;
}
// 入栈
void STPush(stack* ps, STDataType data)
{
assert(ps);
if (ps->top == ps->capacity)
{
STDataType* tmp = (STDataType*)realloc(ps->dys, sizeof(STDataType) * ps->capacity * 2);
if (NULL == tmp)
{
perror("STPush::realloc fail");
return;
}
ps->dys = tmp;
ps->capacity *= 2;
}
ps->dys[ps->top] = data;
ps->top++;
}
// 出栈
void STPop(stack* ps)
{
assert(ps);
assert(!isSTEmpty(ps));
ps->top--;
}
// 取栈顶数据
STDataType STTop(stack* ps)
{
assert(ps);
assert(!isSTEmpty(ps));
return ps->dys[ps->top - 1];
}
// 计算数据个数
int STSize(stack* ps)
{
assert(ps);
return ps->top;
}
// 判空
bool isSTEmpty(stack* ps)
{
assert(ps);
return ps->top == 0;
}
typedef struct {
stack pushst;
stack popst;
} MyQueue;
MyQueue* myQueueCreate() {
MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
STInit(&obj->pushst);
STInit(&obj->popst);
return obj;
}
void myQueuePush(MyQueue* obj, int x) {
STPush(&obj->pushst, x);
}
int myQueuePop(MyQueue* obj) {
if (isSTEmpty(&obj->popst))
{
// 导入
while (!isSTEmpty(&obj->pushst))
{
STPush(&obj->popst, STTop(&obj->pushst));
STPop(&obj->pushst);
}
}
int front = STTop(&obj->popst);
STPop(&obj->popst);
return front;
}
int myQueuePeek(MyQueue* obj) {
if (isSTEmpty(&obj->popst))
{
// 导入
while (!isSTEmpty(&obj->pushst))
{
STPush(&obj->popst, STTop(&obj->pushst));
STPop(&obj->pushst);
}
}
return STTop(&obj->popst);
}
bool myQueueEmpty(MyQueue* obj) {
return isSTEmpty(&obj->popst) && isSTEmpty(&obj->pushst);
}
void myQueueFree(MyQueue* obj) {
STDestroy(&obj->popst);
STDestroy(&obj->pushst);
free(obj);
}
/**
* 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);
*/
posted @   许木101  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示