3.3 栈就像叠盘子,当盘子叠得太高时,就会倾斜倒下。因此,在真实的世界中,当一叠盘子 (栈)超过了一定的高度时,我们就会另起一堆,再从头叠起。实现数据结构SetOfStacks 来模拟这种情况。SetOfStacks由几个栈组成,当前一栈超出容量时,需要创建一个新的栈 来存放数据。SetOfStacks.push()和SetOfStacks.pop()的行为应当和只有一个栈时 表现的一样。

进一步地,

实现函数popAt(int index)在指定的子栈上进行pop操作。

实现第一步:

  1. #include<iostream>
  2. #include<new>
  3. using namespace std;
  4.  
  5. //myStack表示一个栈
  6. class myStack
  7. {
  8. private:
  9. int *buf;
  10. int capacity;
  11. int cur;
  12. public:
  13. myStack(int size=)
  14. {
  15. buf=new int[size];
  16. capacity=size;
  17. cur=-;
  18. }
  19. ~myStack()
  20. {
  21. delete[] buf;
  22. }
  23. void push(int x)
  24. {
  25. buf[++cur]=x;
  26. }
  27. void pop()
  28. {
  29. cur--;
  30. }
  31. int top()
  32. {
  33. return buf[cur];
  34. }
  35. bool empty()
  36. {
  37. return cur==-;
  38. }
  39. bool full()
  40. {
  41. return cur==capacity-;
  42. }
  43. };
  44.  
  45. //一个栈组成的数组
  46. class SetOfStacks
  47. {
  48. private:
  49. myStack *st;
  50. int cur;
  51. int capacity;
  52. public:
  53. SetOfStacks(int cap=)
  54. {
  55. st=new myStack[cap];
  56. capacity=cap;
  57. cur=;
  58. }
  59. ~SetOfStacks()
  60. {
  61. delete[] st;
  62. }
  63. void push(int x)
  64. {
  65. if(st[cur].full())
  66. cur++;
  67. if(cur>capacity-)
  68. return;
  69. st[cur].push(x);
  70. }
  71. void pop()
  72. {
  73. if(st[cur].empty())
  74. cur--;
  75. if(cur<)
  76. return;
  77. st[cur].pop();
  78. }
  79. int top()
  80. {
  81. if(st[cur].empty())
  82. cur--;
  83. if(cur<)
  84. return ;
  85. else
  86. return st[cur].top();
  87. }
  88. bool empty()
  89. {
  90. return cur==&&st[cur].empty();
  91. }
  92. bool full()
  93. {
  94. return cur==capacity-&&st[cur].full();
  95. }
  96. };
  97. int main()
  98. {
  99. SetOfStacks ss1;
  100. for(int i=; i<*+; ++i)
  101. {
  102. ss1.push(i);
  103. }
  104. while(!ss1.empty())
  105. {
  106. cout<<ss1.top()<<endl;
  107. ss1.pop();
  108. }
  109. return ;
  110. }

当加入popAt函数,情况就变得复杂了。因为这时候的数据分布可能出现中间的某些子栈使 用popAt把它们清空了,而后面的子栈却有数据。为了实现方便,我们不考虑因为popAt 带来的空间浪费。即如果我用popAt把中间某些子栈清空了,并不把后面子栈的数据往前移 动。这样一来,cur指向操作的“最后”一个栈,它后面的子栈一定都是空的, 而它本身及前面的子栈由于popAt函数的缘故都有可能是空的。如果没有popAt函数, cur前面的子栈一定都是满的(见上面的例子)。这样一来,push仍然只需要判断一次当前子 栈是否为满。但是,pop函数则要从cur向前一直寻找,直到找到一个非空的子栈, 才能进行pop操作。同理,popAt,top,empty也是一样的。

  1. #include<iostream>
  2. #include<new>
  3. using namespace std;
  4.  
  5. //myStack表示一个栈
  6. class myStack
  7. {
  8. private:
  9. int *buf;
  10. int capacity;
  11. int cur;
  12. public:
  13. myStack(int size=)
  14. {
  15. buf=new int[size];
  16. capacity=size;
  17. cur=-;
  18. }
  19. ~myStack()
  20. {
  21. delete[] buf;
  22. }
  23. void push(int x)
  24. {
  25. buf[++cur]=x;
  26. }
  27. void pop()
  28. {
  29. cur--;
  30. }
  31. int top()
  32. {
  33. return buf[cur];
  34. }
  35. bool empty()
  36. {
  37. return cur==-;
  38. }
  39. bool full()
  40. {
  41. return cur==capacity-;
  42. }
  43. };
  44.  
  45. //一个栈组成的数组
  46. class SetOfStacks
  47. {
  48. private:
  49. myStack *st;
  50. int cur;
  51. int capacity;
  52. public:
  53. SetOfStacks(int cap=)
  54. {
  55. st=new myStack[cap];
  56. capacity=cap;
  57. cur=;
  58. }
  59. ~SetOfStacks()
  60. {
  61. delete[] st;
  62. }
  63. void push(int x)
  64. {
  65. if(st[cur].full())
  66. cur++;
  67. if(cur>capacity-)
  68. return;
  69. st[cur].push(x);
  70. }
  71. void pop()
  72. {
  73. while(st[cur].empty())
  74. cur--;
  75. if(cur<)
  76. return;
  77. st[cur].pop();
  78. }
  79. int top()
  80. {
  81. while(st[cur].empty())
  82. cur--;
  83. if(cur<)
  84. return ;
  85. else
  86. return st[cur].top();
  87. }
  88. bool empty()
  89. {
  90. while(cur>=&&st[cur].empty())
  91. cur--;
  92. return cur==-;
  93. }
  94. bool full()
  95. {
  96. return cur==capacity-&&st[cur].full();
  97. }
  98. void popAt(int idx)
  99. {
  100. while(st[idx].empty()) --idx;
  101. st[idx].pop();
  102. }
  103. };
  104. int main()
  105. {
  106. SetOfStacks ss1;
  107. for(int i=; i<*+; ++i)
  108. {
  109. ss1.push(i);
  110. }
  111. for(int i=; i<; ++i)
  112. {
  113. ss1.popAt();
  114. //ss1.popAt(1);
  115. ss1.popAt();
  116. }
  117. while(!ss1.empty())
  118. {
  119. cout<<ss1.top()<<endl;
  120. ss1.pop();
  121. }
  122. return ;
  123. }

careercup-栈与队列 3.3的更多相关文章

  1. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  2. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  3. 剑指Offer面试题:6.用两个栈实现队列

    一.题目:用两个栈实现队列 题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 原文是使用 ...

  4. C实现栈和队列

    这两天再学习了数据结构的栈和队列,思想很简单,可能是学习PHP那会没有直接使用栈和队列,写的太少,所以用具体代码实现的时候出现了各种错误,感觉还是C语言功底不行.栈和队列不论在面试中还是笔试中都很重要 ...

  5. JavaScript数组模拟栈和队列

    *栈和队列:js中没有真正的栈和队列的类型              一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭       FILO   何时使用:今后只要仅希望数组只能从一端进 ...

  6. 用JS描述的数据结构及算法表示——栈和队列(基础版)

    前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...

  7. JavaScript中的算法之美——栈、队列、表

    序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...

  8. Java数据结构和算法之栈与队列

    二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为 ...

  9. python数据结构之栈、队列的实现

    这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIF ...

  10. 栈和队列的面试题Java实现【重要】

    栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...

随机推荐

  1. C++const与指针

    1.指向常量的指针变量 指向常量的指针变量的定义方法: const 类型标识符 *指针变量名: 如:  const int *p; 这种方法定义的指针变量只可读取它所指向的变量或常量的值,不可借助该指 ...

  2. GIT在LINUX下的基本操作

    没办法,看来,VIM技能也要同步练起来了. 离开了WIN的日常应用安乐窝,外面的世界有多精彩? GIT的错了我再改..呵呵 git clone http://username@1.2.3.4/repo ...

  3. perl unload utf-8 oracle Wide character in print at unload_oracle.pl line 105.

    #!/usr/bin/perl use DBI; use Encode; my $dbName = 'oadb'; my $dbUser = 'vxspace'; my $dbUserPass = ' ...

  4. poj2104

    裸的主席树,没什么好说的 type node=record        l,r,s:longint;      end; ..] of node;     sa,rank,a,b,sum,head: ...

  5. BZOJ3188: [Coci 2011]Upit

    3188: [Coci 2011]Upit Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 24[Submit][Status] ...

  6. Unable to Rebuild JIRA Index

    Symptoms Accessing certain JIRA pages result in: SEVERE: Internal server error com.atlassian.jira.is ...

  7. Google protobuf的安装及使用

    最近应为工作的需要,合作的部门提供了protobuf的接口,总结了一下使用的过程和方法如下: 下载protobuf-2.3.0: http://protobuf.googlecode.com/file ...

  8. Makefile第三讲:终端传值给Makefile、Makefile传值给C++代码

    摘要 终端传值给Makefile,咋传?只需在终端输入以下命令,那么就可以在Makefile文件中放心大担的使用$(abcde)这个变量了,它的值为BBB Makefile fun.h #includ ...

  9. Maven学习一:用Maven创建Java Project

    转自:http://blog.csdn.net/lfsfxy9/article/details/9399093  Maven环境配置只是入门的基础,现在要通过Maven基本命令生成一个Java Pro ...

  10. zedGraph

    “zedGraph”控件画图的时候遇到了一点小问题,就是在同一个控件实例上第一次绘制饼图的时候一切正常,但是再次绘制的时候不是重新绘制新的饼图,而是在原有基础之上又添加进新的对象(PieItem),又 ...