Ex10_2.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:2k
源码类别:

书籍源码

开发平台:

Visual C++

  1. #include<iostream>
  2. using namespace std;
  3. class Excp{                                   //为了简化,本例未用模板
  4. public:
  5. virtual void print(){cerr<<"发生异常"<<endl;}
  6. };
  7. class stackExcp:public Excp{
  8. public:
  9. virtual void print(){cerr<<"栈发生异常"<<endl;}
  10. };
  11. class pushOnFull:public stackExcp{
  12. public:
  13. virtual void print(){cerr<<"栈满,不能压栈"<<endl;}
  14. };
  15. class popOnEmpty:public stackExcp{
  16. public:
  17. void print(){cerr<<"栈已空,无法出栈"<<endl;}
  18. };
  19. class Stack{
  20. int top;                                     //栈顶指针(下标)
  21. int *elements;                               //动态建立的数值
  22. int maxSize;                                 //栈最大允纳的元素个数
  23. public:
  24. Stack(int=20);                               //栈如不指定大小,设为20元素
  25. ~Stack(){delete[] elements;}
  26. void Push(const int &data);                  //压栈
  27. int Pop();                                   //弹出,top--
  28. int GetElem(int i){return elements[i];}      //返回栈顶元素,top不变
  29. void MakeEmpty(){top= -1;}                   //清空栈
  30. bool IsEmpty() const{return top== -1;}       //判栈空
  31. bool IsFull() const{return top==maxSize-1;}  //判栈满
  32. void PrintStack();                           //输出栈内所有数据
  33. };
  34. Stack::Stack(int maxs){
  35. maxSize=maxs;
  36. top=-1;
  37. elements=new int [maxSize];                     //建立栈空间
  38. }
  39. void Stack::PrintStack(){
  40. for(int i=0;i<=top;i++) cout<<elements[i]<<'t';
  41. cout<<endl;
  42. }
  43. void Stack::Push(const int &data){
  44. if(IsFull())  throw pushOnFull();             //栈满则抛出异常
  45. elements[++top]=data;                         //栈顶指针先加1,元素再进栈,top是指向栈顶元素
  46. }
  47. int Stack::Pop(){
  48. if(IsEmpty())  throw popOnEmpty();            //栈已空则不能退栈,抛出异常
  49. return elements[top--];           //返回栈顶元素,同时栈顶指针退1
  50. }
  51. int main(){
  52. int a[9]={1,2,3,4,5,6,7,8,9}, b[9]={0},i;
  53. Stack istack(8);
  54. try{
  55. for(i=0;i<9;i++)  istack.Push(a[i]);      //到a[8]时栈满,异常
  56. istack.PrintStack();
  57. }
  58. catch(Excp&eObj){
  59. eObj.print();                             //调用虚函数pushOnFull::print()
  60. }
  61. try{for(i=0;i<9;i++) b[i]=istack.Pop();}
  62. catch(Excp&eObj){
  63. eObj.print();                             //调用虚函数popOnEmpty::print()
  64. }
  65. for(i=0;i<9;i++) cout<<b[i]<<'t';
  66. cout<<endl;
  67. return 0;
  68. }