02.cpp

来自「掌握词法分析的基本思想」· C++ 代码 · 共 137 行

CPP
137
字号
//stack.h   
  #include<iostream.h>  
  #include<stdlib.h>   
    
  const   int   MaxStackSize=50;   
    
  template<class   T>   
  class   Stack   
  {   
  private:   
  T   stacklist[MaxStackSize];   
  int   top;   
  public:   
  Stack();   
  T   Peek()   const;   
  void   Push(const   T&   item);   
  T   Pop();   
  void   ClearStack();   
  int   StackEmpty()   const;   
  int   StackFull()   const;   
  };   
    
  template<class   T>   
  Stack<T>::Stack():top(-1)     {     }   
    
  template<class   T>   
  void   Stack<T>::Push(const   T&   item)   
  {   
  if(top==MaxStackSize-1)   
  {   
  cerr<<"Stack   overflow!"<<endl;   
  exit(1);   
  }   
  top++;   
  stacklist[top]=item;   
  };   
    
  template<class   T>   
  T   Stack<T>::Pop()   
  {   
  T   temp;   
  if(top==-1)   
  {   
  cerr<<"Attempt   to   pop   an   empty   stack!"<<endl;   
  exit(1);   
  }   
  temp=stacklist[top];   
  top--;   
  return   temp;   
  };   
    
  template<class   T>   
  T   Stack<T>::Peek()   const   
  {   
  if(top==-1)   
  {   
  cerr<<"Attempt   to   peek   an   empty   stack!"<<endl;   
  exit(1);   
  }   
  return   stacklist[top];   
  }   
    
  template<class   T>   
  int   Stack<T>::StackEmpty()   const   
  {   
  return   top==-1;   
  };   
    
  template<class   T>   
  int   Stack<T>::StackFull()   const     
  {   
  return   top==MaxStackSize-1;   
  };   
    
  template<class   T>   
  void   Stack<T>::ClearStack()   
  {   
  top=-1;   
  };   
  //main.cpp   
  #include"Stack.h"   
  void   f()   
  {   
    
  Stack<char>   s;   
  char   op;   
  char   op1;   
  cin>>op;   
  int   n;   
  while(op!='=')   
  {   
  switch(op)   
  {   
  case   '(': f();   
  break;   
  case   ')': goto   sto;   
  case   '+':   
  case   '-': if(s.StackEmpty()==0)   
  {   
  if   (s.Peek()=='+'||s.Peek()=='-')   {   
  op1=s.Pop();   
  cout<<op1;   
  s.Push(op);}   
  }   else   {   
  s.Push(op);}   
                    break;   
  case   '*':   
  case   '/': if(s.StackEmpty()==0)   
  {   
  if   (s.Peek()=='*'||s.Peek()=='/')   {   
  op1=s.Pop();   
  cout<<op1;   
  s.Push(op);   
                                        }else   {s.Push(op);}   
  }else   {   
  s.Push(op);}   
  break;   
  default:         cin.putback(op);   
  cin>>n;   
  cout<<n<<'   ';   
  if   (s.StackEmpty()==0)     
  if   (s.Peek()=='*'||s.Peek()=='/')   {   
  op1=s.Pop();   
  cout<<op1;}   
  }//end   switch   
                  cin>>op;   
  }//end   while   
  sto:         while(s.StackEmpty()!=1)   
  {op1=s.Pop();   
  cout<<op1;}   
  };   
    
  void   main()   
  {   
  f();   
  }   

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?