剑指offer——stack与queue的互相实现
我们知道,stack和queue是C++中常见的container。下面,我们来探究下如何以stack来实现queue,以及如何用queue来实现stack。
首先,先了解下stack与queue的基本属性。
一、stack
1,参数要求
stack模板类需要两个参数:一个元素类型,一个容器类型。容器类型缺省为deque。
2,基本操作
入栈:s.push(element);element加入栈顶。
出栈:s.pop(),栈顶元素被删除,无返回值。
访问栈顶:s.top()。取得栈顶元素。
判断栈空:s.empty()。栈空,返回true;非空,返回false。
长度判断:s.size()。返回栈张元素个数
二、queue
1,参数要求
queue模板类需要两个参数:一个元素类型,一个容器类型。容器类型缺省为deque。
2,基本操作
入队:q.push(element)。element加入到队列的末端。
出对:q.pop()。弹出(删除)队列的第一个元素(q.front())。无返回值。
访问队首:q.front(), 即最早被压入队列的元素。
访问队尾:q.back(),即最后被压入队列的元素。
判断队空:q.empty()。队空,返回true。
长度判断:q.size()。返回队列中元素个数。
三、两个stack实现queue
在基本了解了stack和queue这两个container后,我们来看看如何用stack实现queue。
如上所诉,queue包含了push(), pop(),front(),back(),empty()这些基本操作,现在的问题 就是如何用stack实现这些操作。
1,分析(已知stack A 和stack B)
入队:将元素进栈A
出队:判断B是否为空,如果为空,则将栈A中所有元素pop, 并push进 栈B,栈B出栈。
访问队首:栈B的栈顶。
访问队尾:如果栈A非空,队尾即栈A的栈顶(A.top());如果栈A为空,队尾为栈B的栈底(怎么取得栈B的栈底?利用第三个stack??)
队空:两个栈空,则队空。
长度:A.size(), B.size()
2,示意代码(未实现back())
![](/assets/blank.gif)
![](/assets/blank.gif)
1 class Stack2queue { 2 public: 3 void push(int node) { 4 stack1.push(node); 5 } 6 7 void pop() { 8 if (stack2.empty()) { 9 if (stack1.empty()) 10 throw runtime_error("No elements"); 11 else { 12 while (!stack1.empty()) { 13 stack2.push(stack1.top()); 14 stack1.pop(); 15 } 16 stack2.pop(); 17 } 18 19 }else 20 stack2.pop(); 21 } 22 int front() { 23 if (stack2.empty()) { 24 if (stack1.empty()) 25 throw runtime_error("No elements"); 26 else { 27 while (!stack1.empty()) { 28 stack2.push(stack1.top()); 29 stack1.pop(); 30 } 31 return stack2.top(); 32 } 33 34 }else 35 return stack2.top(); 36 } 37 38 bool myEmpty() { 39 if (stack1.empty() && stack2.empty()) 40 return true; 41 else 42 return false; 43 } 44 private: 45 stack<int> stack1; 46 stack<int> stack2; 47 };
View Code
示意代码中未实现back()操作,笔者的想法是:若栈A为空,将stack B的元素pop出来,再push进 stack C。C的栈顶元素即是队尾。但是这样就新增了一个stack。不知道给广大博友是否有更好的方法?
四、两个queue实现stack
1,分析(queue A 和 queue B)
入栈:将元素push进队列A
出栈:判断队列A是否为空。空,则把队列B的元素出队列,进队列A,A再出队列进队列B,直到A中元素剩1,然后A.pop();非空,队列A中元素出队列进队列B,直到A中元素剩1,然后A.pop().
访问栈顶:与出栈类似,只不过由A.pop()B变为了A.front()或A.back(), 因为此时A只剩下一个元素。
判断栈空:queue1.empty() && queue2.empty()
长度:queue1.size() + queue2.size()
2,示意代码
![](/assets/blank.gif)
![](/assets/blank.gif)
1 class Queue2stack { 2 public: 3 void push(int); 4 void pop(); 5 int top(); 6 bool myempty(); 7 private: 8 queue<int> queue1; 9 queue<int> queue2; 10 }; 11 void Queue2stack::push(int element) { 12 queue1.push(element); 13 } 14 15 void Queue2stack::pop() { 16 if(!queue1.empty()) { 17 while(queue1.size() > 1) { 18 queue2.push(queue1.front()); 19 queue1.pop(); 20 } 21 queue1.pop(); 22 23 } 24 else { 25 if(!queue2.empty()) { 26 while (!queue2.empty()) { 27 queue1.push(queue2.front()); 28 queue2.pop(); 29 } 30 while(queue1.size() > 1) { 31 queue2.push(queue1.front()); 32 queue1.pop(); 33 } 34 queue1.pop(); 35 } 36 37 } 38 } 39 40 int Queue2stack::top() { 41 if(!queue1.empty()) { 42 while(queue1.size() > 1) { 43 queue2.push(queue1.front()); 44 queue1.pop(); 45 } 46 return queue1.back(); 47 48 } 49 else { 50 if(!queue2.empty()) { 51 while (!queue2.empty()) { 52 queue1.push(queue2.front()); 53 queue2.pop(); 54 } 55 while(queue1.size() > 1) { 56 queue2.push(queue1.front()); 57 queue1.pop(); 58 } 59 return queue1.back(); 60 } 61 } 62 throw runtime_error("No elements!"); 63 64 } 65 66 bool Queue2stack::myempty() { 67 if(queue1.empty() && queue2.empty()) 68 return true; 69 else 70 return false; 71 }
View Code
五、综合测试
上述讨论,介绍了stack和queue的相互实现。下面这个例子来检测我们的算法是否正确。
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include <iostream> 2 #include <stack> 3 #include <queue> 4 using namespace std; 5 6 class Stack2queue { 7 public: 8 void push(int node) { 9 stack1.push(node); 10 } 11 12 void pop() { 13 if (stack2.empty()) { 14 if (stack1.empty()) 15 throw runtime_error("No elements"); 16 else { 17 while (!stack1.empty()) { 18 stack2.push(stack1.top()); 19 stack1.pop(); 20 } 21 stack2.pop(); 22 } 23 24 }else 25 stack2.pop(); 26 } 27 int front() { 28 if (stack2.empty()) { 29 if (stack1.empty()) 30 throw runtime_error("No elements"); 31 else { 32 while (!stack1.empty()) { 33 stack2.push(stack1.top()); 34 stack1.pop(); 35 } 36 return stack2.top(); 37 } 38 39 }else 40 return stack2.top(); 41 } 42 43 bool myEmpty() { 44 if (stack1.empty() && stack2.empty()) 45 return true; 46 else 47 return false; 48 } 49 private: 50 stack<int> stack1; 51 stack<int> stack2; 52 }; 53 54 class Queue2stack { 55 public: 56 void push(int); 57 void pop(); 58 int top(); 59 bool myempty(); 60 private: 61 queue<int> queue1; 62 queue<int> queue2; 63 }; 64 void Queue2stack::push(int element) { 65 queue1.push(element); 66 } 67 68 void Queue2stack::pop() { 69 if(!queue1.empty()) { 70 while(queue1.size() > 1) { 71 queue2.push(queue1.front()); 72 queue1.pop(); 73 } 74 queue1.pop(); 75 76 } 77 else { 78 if(!queue2.empty()) { 79 while (!queue2.empty()) { 80 queue1.push(queue2.front()); 81 queue2.pop(); 82 } 83 while(queue1.size() > 1) { 84 queue2.push(queue1.front()); 85 queue1.pop(); 86 } 87 queue1.pop(); 88 } 89 90 } 91 } 92 93 int Queue2stack::top() { 94 if(!queue1.empty()) { 95 while(queue1.size() > 1) { 96 queue2.push(queue1.front()); 97 queue1.pop(); 98 } 99 return queue1.back(); 100 101 } 102 else { 103 if(!queue2.empty()) { 104 while (!queue2.empty()) { 105 queue1.push(queue2.front()); 106 queue2.pop(); 107 } 108 while(queue1.size() > 1) { 109 queue2.push(queue1.front()); 110 queue1.pop(); 111 } 112 return queue1.back(); 113 } 114 } 115 throw runtime_error("No elements!"); 116 117 } 118 119 bool Queue2stack::myempty() { 120 if(queue1.empty() && queue2.empty()) 121 return true; 122 else 123 return false; 124 } 125 int main() 126 { 127 // stack to queue 128 Stack2queue s2q; 129 for (int i = 1; i < 10; ++i) { 130 s2q.push(i); 131 } 132 while (!s2q.myEmpty()) { 133 cout << s2q.front() << ' '; 134 s2q.pop(); 135 } 136 137 //queue to stack 138 cout << endl; 139 Queue2stack q2s; 140 for (int i = 1; i < 10; ++i) { 141 q2s.push(i); 142 } 143 while(!q2s.myempty()) { 144 cout << q2s.top() << ' '; 145 q2s.pop(); 146 } 147 //system("pause"); 148 return 0; 149 }
View Code
实验结果:
我们看到,我们很好的用stack模拟了queue,达到了先进先出的效果;同样,我们也很好的用queue模拟了stack,先进后出的效果。
不过,值得考虑的是,笔者在用stack实现queue时,没有实现back()操作。各位博友有啥好想法呢?
转载于:https://www.cnblogs.com/letgo/p/5733430.html
剑指offer——stack与queue的互相实现相关推荐
- java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值
前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...
- 剑指offer第二版答案详细版(带详细解题思路)
1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...
- 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...
点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...
- 剑指offer(60-67题)详解
文章目录 60 把二叉树打印成多行 61 序列化二叉树 62 二叉搜索树第K个节点 63 数据流中的中位数 64 滑动窗口的最大值 65 矩阵中的路径 66 机器人的运动范围 67 剪绳子 欢迎关注个 ...
- 剑指offer(11-25题)详解
文章目录 11 二进制种1的个数★ 12 数值的正数次方 13 调整数组顺序使奇数位于偶数前面 14 链表中倒数第K个节点 15 反转链表 16 合并两个排序的链表 17 树的子结构 18 二叉树的镜 ...
- 剑指Offer #05 用两个栈实现队列(模拟)
题目来源:牛客网-剑指Offer专题 题目地址:用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目解析 首先,我们需要知道一下基本知 ...
- 剑指offer之21-25题解
剑指offer之21-25题解 目录 栈的压入,弹出序列 从上往下打印二叉树 二叉搜索树的后序遍历序列 二叉树中和为某一值的路径 复杂链表的复制 21. 栈的压入,弹出序列 (一)题目描述 输入两个整 ...
- 剑指offer之11-15题解
剑指offer之11-15题解 目录 二进制中1的个数 数值的整数次方 调整数组顺序使奇数位于偶数前面 链表中第k个节点 反转链表 11. 二进制中1的个数 (一)题目描述 (二)思路 n & ...
- java牛客排序算法题_《剑指offer》面试题28:字符串的排列(牛客网版本) java...
输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符 ...
最新文章
- numpy中的cov(方差计算)简单介绍
- 安装opencv3.3.0碰到的问题及解决方法
- 比较windows phone程序启动和android程序启动原理
- Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健)
- 花费一天时间基于Vue创建的epub小说阅读器效果展示及源码分享
- 博客园官方 NuGet镜像上线试运行
- 学生成绩查询java版_学生成绩查询系统,基于ssm的JAVA系统
- python中int转换为时间戳_python日期和时间戳互相转化操作详解
- 41 岁蚂蚁金服总裁助理去世; 华为首款 5G 手机欧洲上市;库克首谈 5G iPhone | 极客头条...
- java面试题整理_2018年最新java面试题整理。。。持续更新中。。。
- js常用正则表达式(经典)
- linux 命令打印,Linux终端打印命令使用介绍
- 模型预测控制(MPC)解析(一):模型
- cadence SPB17.4 - export placement file to openpnp
- 22个月无休,华为36岁工程师在肯尼亚过劳猝死!
- 硬件模拟大师_用机器人做咖啡,“智咖大师”这样升级新零售
- VBE6EXT.OLB不能被加载问题解决方法
- 用计算机语言写祝福语,有关程序员节的祝福语
- Unity UGUI 图文混排
- 【技术方案】一对一或一对多音视频通话会议系统,可以通过哪些方式实现?