⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7-3-2.cpp

📁 学习c++的ppt
💻 CPP
字号:
#include <iostream.h>
#include <stdlib.h>
#define  STACKSIZE 10
class Stack  {
     private:
           long  buffer[STACKSIZE];
           long  *sp;
     public:
           Stack()  {  sp  = buffer;  }
           ~Stack()  {  };
		   void  Empty()  { sp = buffer; }
		   bool  IsEmpty()  { 
			    if(sp == buffer)  return true;
		        else return false;
		   }
           void  Push(long  data)   {
                if(sp >= buffer+STACKSIZE)
                     cerr << "Stack overflow !" << endl;
                else  *sp ++ = data;
           }
           long  Pop()   {
                if(sp <= buffer)  {
                     cerr << "Stack is Empty!" << endl;
                     return 0;
                }
                else  return  *--sp;
            }
};

class Calculator  {
     private:
	       Stack  Nstack;    //  处理操作数
	       Stack  Ostack;    //  处理运算符
     public:
	       Calculator(void)  {  };
	       void Cal(void);    //计算器运算程序
	       void GetTwoNum(int &Num1,int &Num2);
	       void Compute(char Opr);
	       void Clear(void);
};
void Calculator::Clear() {
      Nstack.Empty();
	  Ostack.Empty();
}
void Calculator::GetTwoNum(int &Num1,int &Num2) {
      Num1=Nstack.Pop();
	  Num2=Nstack.Pop();
}
void Calculator::Compute(char Opr)  {
      int  Num1,  Num2;
      if(Opr != '=' )   GetTwoNum(Num1,Num2);
      switch(Opr)  {
            case '+':  Nstack.Push(Num2 + Num1); break;  //结果压栈
            case '-':  Nstack.Push(Num2 - Num1);  break;
            case '*':  Nstack.Push(Num2 * Num1); break;
            case '/':  Nstack.Push(Num2 / Num1); break;
            case '=':  cout << Nstack.Pop() << endl;         //输出结果
       } 
} 	
void Calculator::Cal(void)  {
      bool b1=true, b2=true; 
      char ch1, ch2, str[50]; 
      int k = -1;
      while(b2)    {
            cin >> ch1;
            if(ch1 >= '0' && ch1 <= '9')  {
	              k++;
	              str[k] = ch1; 
            }   //数字字符添入串中
			else  { 
                  if(k>=0)   {
                       str[k+1] = '\0';   //数字串生成
	                   Nstack.Push(atoi(str)); //数字串转换为整数后压栈
	                   k=-1;
				  }
                  switch(ch1)  {
	                   case 'c': Clear();break;
	                   case '+': case '-':
	                        while(! Ostack.IsEmpty())  {
	                               ch2=Ostack.Pop();   //不会有比'+' '-'优先级低的
	                               Compute(ch2);
							}
	                        Ostack.Push(ch1); break;
	                   case '*':case '/':
                            while(!Ostack.IsEmpty() && b1)  {
	                               ch2=Ostack.Pop();            //把栈顶运算符弹出
	                               if(ch2 == '*' || ch2 == '/')        //比较优先级
	                                      Compute(ch2);            //新的优先级并不高
	                               else  {	                 //新的优先级高
	                                      Ostack.Push(ch2);     //先把原栈中的	                                                  
                                          b1=false;                     //运算符压回去
								   }
							}
                            Ostack.Push(ch1);  //再把新的运算符压栈
	                        b1=true;  break;     //将b1复原   
	                   case '=':
	                        while(!Ostack.IsEmpty())  {
	                               ch2=Ostack.Pop();
	                               Compute(ch2);
                            }
	                        Compute(ch1); break;
				  }
                  if(ch1 == 'z')  b2=false;
			}  
	  }  

}

main()
{    Calculator  MyCal;
     MyCal.Cal();
}

⌨️ 快捷键说明

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