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

书籍源码

开发平台:

Visual C++

  1. //【例7.9】模拟简单计算器,该计算器只认+、-、*、/ 四个运算符,输入为整数。
  2. //表达式结束符使用=号,清空栈用'c'字符。使用'z'字符表示程序结束。
  3. #include<iostream>
  4. #include<cmath>
  5. #include<cstdlib>
  6. #include"Ex7_9.h"  //链栈模板定义文件
  7. using namespace std;
  8. class Calculator{                                 //简易计算器类
  9. Stack<int> Nstack;
  10. Stack<char> Ostack;
  11. public:
  12. Calculator(void){};
  13. void Cal(void);                               //计算器运算程序
  14. void GetTwoNum(int &Num1,int &Num2);
  15. void Compute(char Opr);
  16. void Clear(void);
  17. };
  18. void Calculator::Clear(){
  19. Nstack.MakeEmpty();
  20. Ostack.MakeEmpty();
  21. }
  22. void Calculator::GetTwoNum(int &Num1,int &Num2){
  23. Num1=Nstack.Pop();
  24. Num2=Nstack.Pop();
  25. }
  26. void Calculator::Compute(char Opr){
  27. int Num1,Num2;
  28. if(Opr!='=') GetTwoNum(Num1,Num2);
  29. switch(Opr){
  30. case '+':Nstack.Push(Num2+Num1);break;  //结果压栈
  31. case '-':Nstack.Push(Num2-Num1);break;
  32. case '*':Nstack.Push(Num2*Num1);break;
  33. case '/':Nstack.Push(Num2/Num1);break;
  34. case '=':cout<<Nstack.Pop()<<endl;           //输出结果
  35. }
  36. }
  37. void Calculator::Cal(){
  38. bool b1=true,b2=true;
  39. char ch1,ch2,str[50];
  40. int k=-1;
  41. while(b2){
  42. cin>>ch1;
  43. if(ch1>='0'&&ch1<='9'){
  44. k++;
  45. str[k]=ch1;                           //数字字符添入串中
  46. }
  47. else{
  48. if(k>=0){
  49. str[k+1]='';                       //数字串生成
  50. Nstack.Push(atoi(str)); //数字串转换为整数后压栈
  51. k=-1;
  52. }
  53. switch(ch1){
  54. case 'c':
  55. Clear();
  56. break;
  57. case '+':
  58. case '-':
  59. while(!Ostack.IsEmpty()){
  60. ch2=Ostack.Pop();   //不会有比'+' '-'优先级低的
  61. Compute(ch2);
  62. }
  63. Ostack.Push(ch1);
  64. break;
  65. case '*':
  66. case '/':
  67. while(!Ostack.IsEmpty()&&b1){
  68. ch2=Ostack.Pop();            //把栈顶运算符弹出
  69. if(ch2=='*'||ch2=='/')        //比较优先级
  70. Compute(ch2);            //新的优先级并不高
  71. else{   //新的优先级高
  72. Ostack.Push(ch2);         //先把原栈中的运算符压回去
  73. b1=false;
  74. }
  75. }
  76. Ostack.Push(ch1);             //再把新的运算符压栈
  77. b1=true;           //此句保证乘除从左倒右进行
  78. break;
  79. case '=':
  80. while(!Ostack.IsEmpty()){
  81. ch2=Ostack.Pop();
  82. Compute(ch2);
  83. }
  84. Compute(ch1);
  85. break;
  86. }
  87. if(ch1=='z') b2=false;
  88. }
  89. }
  90. }
  91. int main(){
  92. Calculator Calcul;
  93. cout<<"请输入四则运算式:"<<endl;
  94. Calcul.Cal();
  95. return 0;
  96. }