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

书籍源码

开发平台:

Visual C++

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