首页 > 代码库 > 数据结构 -- 整数算术表达式求值 (C/C++)

数据结构 -- 整数算术表达式求值 (C/C++)

数据结构题集(C语言版)--严蔚敏,吴伟民编著

  1. 设置运算符栈和运算数栈辅助分析运算符有限关系。
  2. 读入表达式的字符序列的同时完成运算符和运算数(整数)的识别处理,以及相应的运算。
  3. 在识别出运算数的同时,要将其字符序列形式转换成整数形式。
  1 /**  2 Function:整数算术表达式求值  3 Date:2014-11-10  4 Author:JackDawson   5 Compiler:gcc version 4.8.1   6 */  7 #include <iostream>  8 #include <stack>//使用标准库中的栈   9 using namespace std; 10  11 //判断运算符栈中的相邻两个运算符的优先级。  12 int judgePrecede(int c1,int c2) 13 { 14     int precede; 15     switch(c1) 16     { 17         case +:precede = (c2 == *|| c2 == /|| c2 == () ? < : >;break; 18         case -:precede = (c2 == *|| c2 == /|| c2 == () ? < : >;break; 19         case *:precede = (c2 == () ? < : >;break; 20         case /:precede = (c2 == () ? < : >;break; 21         case (: 22             if(c2 == #) 23             { 24                 cout<<"Expression you entered maybe is wrong"<<endl; 25                 return 0; 26             } 27             precede = (c2 == )) ? = : <;break; 28         case ): 29             if(c2 == () 30             { 31                 cout<<"Expression you entered maybe is wrong"<<endl; 32                 return 0; 33             } 34             precede = >;break;     35         case #: 36             if(c2 == )) 37             { 38                 cout<<"Expression you entered maybe is wrong"<<endl; 39                 return 0; 40             } 41             precede = (c2 == #) ? = : <;break; 42     }  43     return precede; 44 } 45  46 //判断是否是运算符。  47 bool isOperator(char c) 48 {  49     switch(c) 50     { 51         case+: 52         case-: 53         case*: 54         case/: 55         case(: 56         case): 57         case#:return true; 58         default:return false; 59     } 60 } 61 //判断是否是0-9的数字。  62 bool isNum(char c) 63 { 64     return (c>=48&&c<=57) ? true :false; 65 } 66  67 //计算a与b的结果。  68 int Operate(int a,char theta,int b) 69 { 70    int c; 71    switch(theta) 72    { 73      case +: 74              c=a + b; 75             break; 76      case -: 77              c=a - b; 78             break; 79      case *: 80              c=a * b; 81             break; 82      case /: 83              if(b == 0) 84              { 85                  cout<<"Divisor cannot be zero"<<endl; 86                  exit(0); 87              }  88             c=a / b; 89    } 90    return c; 91 } 92  93 //计算表达式。  94 int evaluateExpression() 95 { 96     stack<int> OPND; 97     stack<char> OPTR; 98     int a,b,temp; 99     char c,d,theta;100     OPTR.push(#);101     c = getchar();102     while(c != #||OPTR.top() != #)//当表达式未结束时循环。103     {104         //如果c为运算符。 105         if(isOperator(c))106         switch(judgePrecede(OPTR.top(),c))107         {108             //运算符栈中如果前一个运算符优先级小于后一个运算符优先级,则把c压入运算符栈中。 109             case <:110                     OPTR.push(c);111                     c = getchar();112                     break;113             //运算符栈中如果前一个运算符优先级大于后一个运算符优先级,则计算数字栈中的栈顶两数的结果。         114             case >:115                     b = OPND.top();116                     OPND.pop();117                     a = OPND.top();118                     OPND.pop();119                     theta = OPTR.top();120                     OPTR.pop();121                     temp = Operate(a,theta,b);122                     OPND.push(temp);//将计算结果压入数字栈中。 123                     break;124             //运算符栈中如果前一个运算符优先级等于后一个运算符优先级。         125             case =:126                     OPTR.pop();//弹出与运算符优先级级相等的运算符。 127                     c = getchar();128                     break;129         }130         //如果c为数字。 131         else if(isNum(c))132         {133             temp = c - 48;//把字符c化为与数字。134               d = getchar();135               while(isNum(d))//如果d也为数字,则把d与c计算后加起来。 136               {137                   temp = 10 * temp + (d - 48);138                   d = getchar();139               }140               OPND.push(temp);141               c = d;//d为运算符,赋值给c。 142         }143         //如果不是运算符也不是数字0-9。144         else145         {146             cout<<"Input Error"<<endl;147             exit(0);148         }149     }150     return OPND.top();//返回最终计算结果。151 }152 153 int main(int argc, int *argv[])154 {155     while(1)156     {157         cout<<"Input Expression(Enter # to end input):";158         cout<<evaluateExpression()<<endl;159         cout<<"Press Enter to Exit"<<endl;160         fflush(stdin); 161     }162     return 0;163 }

 

数据结构 -- 整数算术表达式求值 (C/C++)