码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-11-10 21:50:02      阅读:421      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   ar   os   使用   sp   数据   

数据结构题集(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++)

标签:style   blog   io   color   ar   os   使用   sp   数据   

原文地址:http://www.cnblogs.com/jackdawson/p/4088158.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!