数据结构 -- 整数算术表达式求值 (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         else

145         {

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++)