1. 剑指Offer - 九度1512 - 用两个栈实现队列
    2013-11-29 21:23
题目描述:

用两个栈来实现一个队列,完成队列的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
  1. 题意分析:
      用两个栈实现一个队列。栈(stack)的特点是先进后出,是反的;而队列(queue)的特点是先进先出,是正的。因此用两个栈,反两次就能正过来。接下来咱看看怎么个反法。
      咱们从例子入手:四个数1 2 3 4进入队列,如果这时想pop的话,应当是1出队。两个栈s1s2如下(左边代表栈顶):
        s1 = [4, 3, 2, 1]
        s2 = []
      但是1 2 3 4进栈时,栈顶元素是4。要想取出1的话,必须先pop432pop出来的元素又不能扔掉,就扔另一个栈里去吧,于是就成了这样:
        s1 = [1]
        s2 = [2, 3, 4]
      因为进站后顺序又反了一次,所以s2中存储的顺序就是正确的出队顺序,这时直接从s1pop出元素‘1’即可。如果要继续pop元素的话,s2栈不为空,直接pop就能得到正确的结果。
      于是有了下面的思路:
         1. 初始化s1s2为空。
         2. 当进队时,直接将元素pushs1
         3. 当出队时,
           s2不为空,直接pop s2的元素即可出队;
           s2为空,则将s1中元素pop出来,并pushs2中,直到s1只剩一个元素。剩的那个元素pop出来就是出队的元素。
           当然,两个栈都为空的话pop操作是无效的。
      这题应该算是很经典的面试题了,挺巧妙的。以下是ac的代码。push入队时间复杂度O(1),pop出队时间复杂度O(1)或O(n),均摊下来仍是O(1)。
  1. // 651425 zhuli19901106 1512 Accepted 点击此处查看所有case的执行结果 1184KB 1415B 70MS
  2. //
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <stack>
  6. using namespace std;
  7.  
  8. class MyQueue{
  9. public:
  10. MyQueue()
  11. {
  12. }
  13.  
  14. ~MyQueue()
  15. {
  16. while(!s1.empty()){
  17. s1.pop();
  18. }
  19. while(!s2.empty()){
  20. s1.pop();
  21. }
  22. }
  23.  
  24. void push(int n)
  25. {
  26. s1.push(n);
  27. }
  28.  
  29. int pop()
  30. {
  31. if(s1.size() <= && s2.size() <= ){
  32. // The queue is empty, return -1 to signal an error.
  33. return -;
  34. }
  35. if(s2.size() > ){
  36. int res = s2.top();
  37. s2.pop();
  38. return res;
  39. }else{
  40. int res;
  41. while(s1.size() > ){
  42. res = s1.top();
  43. s1.pop();
  44. s2.push(res);
  45. }
  46. res = s1.top();
  47. s1.pop();
  48. return res;
  49. }
  50. }
  51.  
  52. void clear()
  53. {
  54. while(s1.size() > ){
  55. s1.pop();
  56. }
  57. while(s2.size() > ){
  58. s2.pop();
  59. }
  60. }
  61.  
  62. int size()
  63. {
  64. return s1.size() + s2.size();
  65. }
  66. private:
  67. stack<int> s1, s2;
  68. };
  69.  
  70. int main()
  71. {
  72. char s[];
  73. int n;
  74. int i;
  75. int tmp;
  76. MyQueue queue;
  77.  
  78. while(scanf("%d", &n) == ){
  79. for(i = ; i < n; ++i){
  80. scanf("%s", s);
  81. if(strcmp(s, "PUSH") == ){
  82. scanf("%d", &tmp);
  83. queue.push(tmp);
  84. }else if(strcmp(s, "POP") == ){
  85. printf("%d\n", queue.pop());
  86. }
  87. }
  88. queue.clear();
  89. }
  90.  
  91. return ;
  92. }

剑指Offer - 九度1512 - 用两个栈实现队列的更多相关文章

  1. 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先

    剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...

  2. 剑指Offer - 九度1519 - 合并两个排序的链表

    剑指Offer - 九度1519 - 合并两个排序的链表2013-11-30 22:04 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hi ...

  3. 剑指offer第二版-9.用两个栈实现队列

    描述:使用两个栈实现一个队列.队列中实现尾部插入和头部删除函数. 思路:stack1负责插入,stack2负责弹出,如果stack2为空了,将stack1的元素依次弹出并存放到stack2中,之后对s ...

  4. 剑指offer【05】- 用两个栈实现队列(java)

    题目:用两个栈实现队列 考点:栈和队列 题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:每次psuh是时先将stack2清空放入stck1(保 ...

  5. 剑指offer(9)——用两个栈实现队列

    题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 思路: 首先定义两个栈stack1. ...

  6. JS 剑指Offer(六) 用两个栈实现队列

    题目:用两个栈实现队列,实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数,若队列中没有元素deleteHead返回-1 分析:在队列的尾部插入 ...

  7. 剑指Offer:面试题7——用两个栈实现队列(java实现)

    题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 首先定义两个栈 Stack<Integer> stack1 = new Stack<I ...

  8. 《剑指Offer》面试题-用两个栈实现队列

    题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 输入: 每个输入文件包含一个测试样例.对于每个测试样例,第一行输入一个n(1<=n<=100 ...

  9. 剑指offer(5)用两个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目分析 栈是先进后出,队列是先进先出,因此两个栈,一个用来push,一个用来pop,同时注意下两个栈不 ...

随机推荐

  1. MySQL入门很简单: 6 视图

    1. 视图含义作用 视图是虚拟的表,是从数据率中一个或多个表中导出来的表:  数据库中只存放了视图的定义,没有存放视图中的数据,数据在原先的表中:  一旦表中的数据发生变化,显示在视图中的数据也会发生 ...

  2. 利用Excel导入数据到SAP C4C

    假设要导入一个Account数据到C4C系统. 工作中心Data Workbench,工作中心视图Import,点download metadata: 会下载一个压缩包到本地. 进入文件夹Templa ...

  3. Leetcode 22. Generate Parentheses Restore IP Addresses (*) 131. Palindrome Partitioning

    backtracking and invariant during generating the parathese righjt > left  (open bracket and cloas ...

  4. javascript中的循环引用对象处理

    先说明一下什么是循环引用对象: var a={"name":"zzz"}; var b={"name":"vvv"}; ...

  5. 【JavaScript 封装库】BETA 5.0 测试版发布!

    JavaScript 前端框架(封装库) BETA 5.0 已于10月10日正式发布,今天开始提供 BETA 5.0 的 API 参考文献.相较于之前 5 个版本的发布都是草草的提供源代码,并没有很多 ...

  6. InnoDB锁演示

    create table t1( c1 int(10) unsigned not null default '0', c2 int(10) unsigned not null default '0', ...

  7. 【UOJ139】【UER #4】被删除的黑白树(贪心)

    点此看题面 大致题意: 请你给一棵树黑白染色,使每一个叶结点到根节点的路径上黑节点个数相同. 贪心 显然,按照贪心的思想,我们要让叶结点到根节点的路径上黑节点的个数尽量大. 我们可以用\(Min_i\ ...

  8. vuejs中v-if的深层用法v-else,v-else-if,key

    <div id='root'> <div v-if='show'>helle world</div> <button @click='handleClick' ...

  9. Android Support v4,v7,v13的区别和应用场景

    android-support-v4 是谷歌推出的兼容包,最低兼容Android1.6的系统,里面有类似ViewPager等控件.ViewPager在Android 1.6以下的版本是不自带的,所以要 ...

  10. 1018: Give me the answer

    1018: Give me the answer 时间限制: 1 Sec  内存限制: 32 MB提交: 55  解决: 15[提交][状态][讨论版][命题人:外部导入] 题目描述 Farmer J ...