C++两个栈实现一个队列和两个队列实现一个栈
今天用C++实现了下两个栈模拟一个队列和两个队列模拟一个栈!代码可能有很多漏洞,如果读者发现问题,
可以及时反馈,非常感谢!!!
代码如下:
#include <iostream> #include <stdlib.h> #include <stack> #include <queue> using namespace std; #if 1 // *******两个栈实现一个队列******** typedef int ElemType; typedef struct { stack<ElemType>s1; //负责入队列 stack<ElemType>s2; //负责出队列 }SQueue; //判断队列是否为空 bool IsEmpty(SQueue &q) { if ((q.s1.empty()) && (q.s2.empty())) { return true; } return false; } // 入队列 void EnQueue(SQueue &q, ElemType e) { q.s1.push(e); } // 队列大小 int GetQueueSize(SQueue &q) { return q.s1.size() + q.s2.size(); } //出队列 void DeQueue(SQueue &q) { if (q.s2.empty()) { while (!q.s1.empty()) { q.s2.push(q.s1.top()); q.s1.pop(); } } if (!q.s2.empty()) { //队空 q.s2.pop(); //出队列 } } // 取队首先元素 ElemType GetFront(SQueue &q) { if (q.s2.empty()) { while (!q.s1.empty()) { q.s2.push(q.s1.top()); q.s1.pop(); } } if (q.s2.empty()) { //队空 throw; } return q.s2.top(); } int main() { SQueue sq; EnQueue(sq, 1); EnQueue(sq, 2); EnQueue(sq, 3); EnQueue(sq, 4); EnQueue(sq, 5); EnQueue(sq, 6); cout << GetFront(sq) << endl; DeQueue(sq); cout << GetFront(sq) << endl; DeQueue(sq); cout << GetFront(sq) << endl; DeQueue(sq); cout << GetFront(sq) << endl; cout << GetFront(sq) << endl; cout << GetQueueSize(sq) << endl; return 0; } #endif #if 1 // ****两个队列实现一个栈**** typedef int ElemType; typedef struct { queue<ElemType>q1; //入队 queue<ElemType>q2; //中转 }QStack; // 栈是否为空 bool IsEmpty(QStack s) { if (s.q1.empty()) { return true; } return false; } // 栈大小 int GetStackSize(QStack s) { return s.q1.size(); } //压栈 void Push(QStack &s, ElemType e) { s.q1.push(e); } //弹栈 void Pop(QStack &s) { if (!s.q1.empty()) { while (s.q1.size() != 1) { //队列q1的n-1个元素移动到q2 s.q2.push(s.q1.front()); s.q1.pop(); } s.q1.pop(); while (!s.q2.empty()) { s.q1.push(s.q2.front()); s.q2.pop(); } } } //取栈顶元素 int Top(QStack &s) { if (s.q1.empty()) { throw; //栈空 } while (!s.q1.empty()) { //队列q1的n个元素移动到q2 s.q2.push(s.q1.front()); s.q1.pop(); } ElemType tmp = s.q2.back(); //获取第n个元素 while (!s.q2.empty()) { s.q1.push(s.q2.front()); s.q2.pop(); } return tmp; } int main() { QStack qs; Push(qs, 1); Push(qs, 2); Push(qs, 3); Push(qs, 4); try { cout << Top(qs) << endl; Pop(qs); cout << Top(qs) << endl; Pop(qs); cout << Top(qs) << endl; Pop(qs); cout << Top(qs) << endl; Pop(qs); cout << "size:" << GetStackSize(qs) << endl; } catch (...) { } if (IsEmpty(qs)) { cout << "栈空" << endl; } else { cout << "栈非空" << endl; } return 0; } #endif // 1
posted on 2016-05-04 22:11 CodeNutter 阅读(388) 评论(0) 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 通过一个DEMO理解MCP(模型上下文协议)的生命周期
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 7 个最近很火的开源项目「GitHub 热点速览」
· DeepSeekV3:写代码很强了
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· Visual Studio 2022 v17.13新版发布:强化稳定性和安全,助力 .NET 开发提
· AI浏览器自动化实战