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

书籍源码

开发平台:

Visual C++

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