题目描述:

用两个栈来实现一个队列,完成队列的Push和Pop操作。
队列中的元素为int类型。

输入:

每个输入文件包含一个测试样例。
对于每个测试样例,第一行输入一个n(1<=n<=100000),代表队列操作的个数。
接下来的n行,每行输入一个队列操作:
1. PUSH X 向队列中push一个整数x(x>=0)
2. POP 从队列中pop一个数。

输出:

对应每个测试案例,打印所有pop操作中从队列pop中的数字。如果执行pop操作时,队列为空,则打印-1。

样例输入:
  1. 3
  2. PUSH 10
  3. POP
  4. POP
样例输出:
  1. 10
  2. -1

题解:应该是考察STL栈应用的一道面试题,还有一点小技巧,不要用两个水杯倒来倒去(如图,明显错误做法)。用一个水杯倒就可以了。

代码:C的简洁 && C++的优雅。

C代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. int main(int argc, char const *argv[])
  6. {
  7. int t, data, top1, top2;
  8. top1 = top2 = 0;
  9. scanf("%d", &t);
  10. char command[10];
  11. int *stack1 = (int *)malloc( (t+1) * sizeof(int));
  12. int *stack2 = (int *)malloc( (t+1) * sizeof(int));
  13. while(t--){
  14. scanf("%s", command);
  15. if(strcmp(command, "PUSH") == 0){
  16. scanf("%d", &data);
  17. stack1[top1++] = data;
  18. }
  19. if(strcmp(command, "POP") == 0){
  20. if(!top1 && !top2) printf("-1\n");
  21. else{
  22. if(!top2)
  23. while(top1)
  24. stack2[top2++] = stack1[--top1];
  25. printf("%d\n", stack2[--top2]);
  26. }
  27. }
  28. }
  29. return 0;
  30. }

  

C++ 代码:

  1. #include <cstdio>
  2. #include <stack>
  3. using namespace std;
  4. char ch[10];
  5. class queue
  6. {
  7. public:
  8. void push(int a)
  9. {
  10. pushStack.push(a);
  11. }
  12. int pop()
  13. {
  14. int tmp = -1;
  15. if (popStack.empty())
  16. {
  17. if (pushStack.empty())
  18. return -1;
  19. else
  20. {
  21. while (!pushStack.empty())
  22. {
  23. popStack.push(pushStack.top());
  24. pushStack.pop();
  25. }
  26. }
  27. }
  28. tmp = popStack.top();
  29. popStack.pop();
  30. return tmp;
  31. }
  32. private:
  33. stack<int> pushStack;
  34. stack<int> popStack;
  35. };
  36.  
  37. int main()
  38. {
  39. int n,t;
  40. while(scanf("%d",&n) != EOF)
  41. {
  42. queue q;
  43. for(int i = 0; i < n; ++i)
  44. {
  45. scanf("%s",ch);
  46. if(ch[1] == 'U')
  47. {
  48. scanf("%d",&t);
  49. q.push(t);
  50. }else
  51. {
  52. printf("%d\n",q.pop());
  53. }
  54. }
  55. }
  56. return 0;
  57. }

  

C++的 优雅写法:

  1. #include<iostream>
  2. #include<stdlib.h>
  3. #include<stack>
  4. using namespace std;
  5.  
  6. template <typename T>class CQueue
  7. {
  8. public:
  9. CQueue(void);
  10. ~CQueue(void);
  11. void appendtail(const T& node);
  12. T deleteHead();
  13. private:
  14. stack<T> stack1;
  15. stack<T> stack2;
  16.  
  17. };
  18.  
  19. //构造函数
  20. template <typename T> CQueue<T>::CQueue(void)
  21. {
  22. }
  23.  
  24. //析构函数
  25. template <typename T> CQueue<T>::~CQueue(void)
  26. {
  27. }
  28.  
  29. //插入元素
  30. template <typename T> void CQueue<T>::appendtail(const T& node)
  31. {
  32. stack1.push(node);
  33. }
  34.  
  35. //删除元素并返回
  36. template <typename T> T CQueue<T>::deleteHead()
  37. {
  38. if(stack2.size()<=0)
  39. {
  40. while(stack1.size()>0)
  41. {
  42. stack2.push(stack1.top());
  43. stack1.pop();
  44. }
  45. }
  46. if(stack2.size()==0)
  47. throw new exception("队列为空");
  48. T head=stack2.top();
  49. stack2.pop();
  50. return head;
  51. }
  52.  
  53. void main()
  54. {
  55. CQueue<int> queue;
  56. queue.appendtail(1);
  57. queue.appendtail(2);
  58. queue.appendtail(3);
  59. queue.appendtail(4);
  60. int len=4;
  61. while(len>0)
  62. {
  63. cout<<queue.deleteHead()<<endl;
  64. --len;
  65. }
  66. }

  

《剑指Offer》面试题-用两个栈实现队列的更多相关文章

  1. 《剑指Offer》-005 -用两个栈实现队列

    如题 (总结要点) 用两个栈实现队列 栈; 先进后出 队列: 先进先出 两个栈, 相等于两个杯子; 把一本水倒来倒去, 取到杯子底部的元素,并且删除,再倒回去 原文链接 : 借鉴学习文章列表 链接1: ...

  2. 剑指offer:JZ9 用两个栈实现队列

    JZ9 用两个栈实现队列 描述 用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能. 队列中的元素为int类型.保证操作合法,即保 ...

  3. 剑指offer 05:用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题代码 import java.util.Stack; public class Solution{ ...

  4. 剑指offer五之用两个栈实现队列

    一.题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 二.思路 1.Push操作:将数据直接压入stack1即可 2.Pop操作:将stack1中的数据全部弹 ...

  5. 【剑指 Offer】09.用两个栈实现队列

    题目描述 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead , 分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,del ...

  6. 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ...

  7. 剑指Offer系列_09_用两个栈实现队列

    package leetcode.sword_to_offfer.day01; import java.util.LinkedList; /** * 用两个栈实现一个队列.队列的声明如下,请实现它的两 ...

  8. 剑指offer 面试题52. 两个链表的第一个公共节点

    这题之前leetcode做过,权当复习 首先这题没说是否一定有公共节点,如果代码可能因为这一点造成死循环的,需要提前验证所给两个链表是否有公共节点. 方法1:对于每一个list1的节点,遍历list2 ...

  9. 剑指offer(五):用两个栈实现一个队列

    题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决办法: 队列先进先出,栈先进后出(stack1和stack2) 其实主要要注意的点是: ①在添加时直接 ...

  10. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

随机推荐

  1. XP下类似%windir% %userprofile% 的变量的说明(转)

    在一些批处理或者系统技巧操作教程文章中,我们常常会看到一些形如 %windir% 或者 %systemdrive% 的变量.这些变量都代表着什么含义呢?下面小技巧之家为大家整理了在Windows XP ...

  2. CQRS

    CQRS 2015-06-04 15:33 by 敏捷的水, 177 阅读, 0 评论, 收藏, 编辑 CQRS是Command Query Responsibility Seperation(命令查 ...

  3. HTTPS那个东西(一)-HTTPS原理

    HTTPS那个东西(一) 最近看了<http权威指南>几个章节,对HTTPS随着节,了一些资料,遂打算记录一下心得.写的仓促,肯定有非常多错误的地方,欢迎大家指正. 1.HTTP是什么 那 ...

  4. 3.集--LinkedTransferQueue得知

    近期在阅读开源项目里,发现有几个project都不尽同样地使用LinkedTransferQueue这个数据结构.比方netty,grizzly,xmemcache,Bonecp. Bonecp还扩展 ...

  5. java:高速排序算法与冒泡排序算法

     Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /**   *  * @Description:  * @author:cuiyaon ...

  6. 类别sort使用排序

    2129: 船上的第二次测试第三个问题 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 243  Solved: 74 [Submit][id=2129 ...

  7. 【百度地图API】如何制作多途经点的线路导航——驾车篇

    原文:[百度地图API]如何制作多途经点的线路导航--驾车篇 摘要: 休假结束,酸奶小妹要从重庆驾车去北京.可是途中要去西安奶奶家拿牛奶饼干呢!用百度地图API,能不能帮我实现这个愿望呢? ----- ...

  8. 在ASP.NET应用中执行后台任务

    在ASP.NET应用中执行后台任务 昨天下午,在微软的MVP 2015社区大讲堂上给大家分享了一个题目:在ASP.NET应用中执行后台任务.这是一点都不高大上,并且还有点土气的技术分享.不过我相信很多 ...

  9. Delphi三层网络架构代码实现

    Delphi三层网络架构代码实现 1 .三层网络的概念 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为: 表现层(UI).业务逻辑层(BLL).数据访 ...

  10. struts2文件下载 <result type="stream">

    <!--struts.xml配置--> <action name="download" class="com.unmi.action.DownloadA ...