我们知道,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())

 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,示意代码

 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的相互实现。下面这个例子来检测我们的算法是否正确。

  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的互相实现相关推荐

  1. java queue 最大值_[剑指offer题解]队列的最大值/滑动窗口的最大值

    前言 众所周知,<剑指offer>是一本"好书". 为什么这么说? 因为在技术面试中,它里面罗列的算法题在面试中出现的频率是非常非常高的. 有多高,以我目前不多的面试来 ...

  2. 剑指offer第二版答案详细版(带详细解题思路)

    1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...

  3. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...

    点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...

  4. 剑指offer(60-67题)详解

    文章目录 60 把二叉树打印成多行 61 序列化二叉树 62 二叉搜索树第K个节点 63 数据流中的中位数 64 滑动窗口的最大值 65 矩阵中的路径 66 机器人的运动范围 67 剪绳子 欢迎关注个 ...

  5. 剑指offer(11-25题)详解

    文章目录 11 二进制种1的个数★ 12 数值的正数次方 13 调整数组顺序使奇数位于偶数前面 14 链表中倒数第K个节点 15 反转链表 16 合并两个排序的链表 17 树的子结构 18 二叉树的镜 ...

  6. 剑指Offer #05 用两个栈实现队列(模拟)

    题目来源:牛客网-剑指Offer专题 题目地址:用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目解析 首先,我们需要知道一下基本知 ...

  7. 剑指offer之21-25题解

    剑指offer之21-25题解 目录 栈的压入,弹出序列 从上往下打印二叉树 二叉搜索树的后序遍历序列 二叉树中和为某一值的路径 复杂链表的复制 21. 栈的压入,弹出序列 (一)题目描述 输入两个整 ...

  8. 剑指offer之11-15题解

    剑指offer之11-15题解 目录 二进制中1的个数 数值的整数次方 调整数组顺序使奇数位于偶数前面 链表中第k个节点 反转链表 11. 二进制中1的个数 (一)题目描述 (二)思路 n & ...

  9. java牛客排序算法题_《剑指offer》面试题28:字符串的排列(牛客网版本) java...

    输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符 ...

最新文章

  1. numpy中的cov(方差计算)简单介绍
  2. 安装opencv3.3.0碰到的问题及解决方法
  3. 比较windows phone程序启动和android程序启动原理
  4. Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健)
  5. 花费一天时间基于Vue创建的epub小说阅读器效果展示及源码分享
  6. 博客园官方 NuGet镜像上线试运行
  7. 学生成绩查询java版_学生成绩查询系统,基于ssm的JAVA系统
  8. python中int转换为时间戳_python日期和时间戳互相转化操作详解
  9. 41 岁蚂蚁金服总裁助理去世; 华为首款 5G 手机欧洲上市;库克首谈 5G iPhone | 极客头条...
  10. java面试题整理_2018年最新java面试题整理。。。持续更新中。。。
  11. js常用正则表达式(经典)
  12. linux 命令打印,Linux终端打印命令使用介绍
  13. 模型预测控制(MPC)解析(一):模型
  14. cadence SPB17.4 - export placement file to openpnp
  15. 22个月无休,华为36岁工程师在肯尼亚过劳猝死!
  16. 硬件模拟大师_用机器人做咖啡,“智咖大师”这样升级新零售
  17. VBE6EXT.OLB不能被加载问题解决方法
  18. 用计算机语言写祝福语,有关程序员节的祝福语
  19. Unity UGUI 图文混排
  20. 【技术方案】一对一或一对多音视频通话会议系统,可以通过哪些方式实现?

热门文章

  1. 怎么把视频倒放,用最简单的方法实现最佳效果
  2. Opencv实现视频倒放
  3. c语言标志位设置原理
  4. 支付宝商户申请流程(仅供参考)
  5. 微信发朋友圈/评论/点赞/搜索/购物车测试用例
  6. 机器学习笔记——线性回归与逻辑回归
  7. SpringBoot中文文档 SpringBoot中文参考指南 SpringBoot中文参考文档 springboot中文文档 springboot中文
  8. 比较全的前端开发面试问题及答案整理
  9. Synchronizing CPU and GPU Work 同步CPU和GPU工作
  10. C语言程序设计CAP——C语言学习笔记(五) 下