队列实现栈
用两个队列实现一个栈
题目描述
解题思路
首先梳理下队列和栈的概念, 队列是所有数据先入先出, 而栈是后入先出
第二步, 用两个队列结构模拟出一个栈结构
第三步,思考如何用模拟出来的栈,完成入栈, 出栈, 取栈顶数据和判空操作,这里说一下我的思路
入栈: 入不为空的队列, 如果两个队列都为空则入队列2
出栈: 将不为空队列中的数据导入到空的队列中, 让不为空队列只剩一个数据, 最后将这个数据出队, 这样就模拟了出栈操作
取栈顶数据: 取不为空的队尾数据, 就是取栈顶数据
判断栈是否为空: 如果两个队列都没有数据,就表示栈为空
下面代码实现
typedef int QueDataType; typedef struct QueNode { QueDataType data; struct QueNode* next; }QueNode; typedef struct Queue { QueNode* head; QueNode* tail; int size; }Queue; // 初始化队列 void QueInit(Queue* pq); // 销毁队列 void QueDestroy(Queue* pq); // 入队 void QuePush(Queue* pq, QueDataType x); // 出队 void QuePop(Queue* pq); // 计算队列中数据个数 int QueSize(Queue* pq); // 判空 bool isQueEmpty(Queue* pq); // 取队头数据 QueDataType QueFront(Queue* pq); // 取队尾数据 QueDataType QueBack(Queue* pq); // 初始化 void QueInit(Queue* pq) { assert(pq); pq->head = pq->tail = NULL; pq->size = 0; } // 销毁 void QueDestroy(Queue* pq) { assert(pq); QueNode* cur = pq->head; while (cur) { QueNode* next = cur->next; free(cur); cur = next; } pq->head = pq->tail = NULL; pq->size = 0; } // 入队 void QuePush(Queue* pq, QueDataType x) { assert(pq); QueNode* newnode = (QueNode*)malloc(sizeof(QueNode)); if (NULL == newnode) { perror("QuePush::malloc fail"); return; } newnode->data = x; newnode->next = NULL; if (NULL == pq->head) { pq->head = pq->tail = newnode; } else { pq->tail->next = newnode; pq->tail = newnode; } pq->size++; } // 出队 void QuePop(Queue* pq) { assert(pq); assert(pq->head); // 处理单个节点的特殊情况 if (NULL == pq->head->next) { free(pq->head); pq->head = pq->tail = NULL; } else { QueNode* next = pq->head->next; free(pq->head); pq->head = next; } pq->size--; } // 计算队列中数据个数 int QueSize(Queue* pq) { assert(pq); return pq->size; } // 判空 bool isQueEmpty(Queue* pq) { assert(pq); return pq->size == 0; } // 取队头数据 QueDataType QueFront(Queue* pq) { assert(pq); assert(!isQueEmpty(pq)); return pq->head->data; } // 取队尾数据 QueDataType QueBack(Queue* pq) { assert(pq); assert(!isQueEmpty(pq)); return pq->tail->data; } typedef struct { Queue q1; Queue q2; } MyStack; MyStack* myStackCreate() { MyStack* st = malloc(sizeof(MyStack)); // 初始化 QueInit(&st->q1); QueInit(&st->q2); return st; } void myStackPush(MyStack* obj, int x) { if (isQueEmpty(&obj->q1)) { QuePush(&obj->q2, x); } else { QuePush(&obj->q1, x); } } int myStackPop(MyStack* obj) { Queue* EmptyQue = &obj->q2; Queue* NoneEmptyQue = &obj->q1; if (isQueEmpty(&obj->q1)) { EmptyQue = &obj->q1; NoneEmptyQue = &obj->q2; } while (QueSize(NoneEmptyQue) > 1) { QuePush(EmptyQue, QueFront(NoneEmptyQue)); QuePop(NoneEmptyQue); } int ret = QueFront(NoneEmptyQue); QuePop(NoneEmptyQue); return ret; } int myStackTop(MyStack* obj) { if (isQueEmpty(&obj->q1)) { return QueBack(&obj->q2); } else { return QueBack(&obj->q1); } } bool myStackEmpty(MyStack* obj) { return isQueEmpty(&obj->q1) && isQueEmpty(&obj->q2); } void myStackFree(MyStack* obj) { QueDestroy(&obj->q1); QueDestroy(&obj->q2); free(obj); } /** * Your MyStack struct will be instantiated and called as such: * MyStack* obj = myStackCreate(); * myStackPush(obj, x); * int param_2 = myStackPop(obj); * int param_3 = myStackTop(obj); * bool param_4 = myStackEmpty(obj); * myStackFree(obj); */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端