栈实现队列
用两个栈实现队列
思路
首先, 梳理下栈和队列的概念, 如下图
栈中所有数据遵循后入先出, 而队列是先入先出
然后, 理解用两个栈模拟出的队列结构
最后思考如何用模拟出的队列实现入队, 出队, 取队头数据和判空操作, 这里说一下我的思路
入队: 入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); */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!