计算后缀表达式

  1 #include<iostream>
  2 #include<string>
  3 #include<stack>
  4 using namespace std;
  5 
  6 void TransformExpr(char *oldexpr,char *newexpr)
  7 {
  8 stack<char> s;
  9 int i=0;
 10 int j=0;
 11 while(oldexpr[i] != '\0')
 12 {
 13 switch(oldexpr[i])
 14 {
 15 case '(' :
 16 s.push(oldexpr[i++]);
 17 break;
 18 case '+':
 19 case '-':
 20 while(s.size()>0 && s.top() != '(')
 21 {
 22 newexpr[j++] = s.top();
 23 s.pop();
 24 }
 25 s.push(oldexpr[i++]);
 26 break;
 27 case '*':
 28 case '/':
 29 while(s.size()>0 && s.top() != '(' && (s.top() == '*' || s.top() == '/'))
 30 { 
 31 newexpr[j++] = s.top();
 32 s.pop();
 33 }
 34 s.push(oldexpr[i++]);
 35 break;
 36 case ')':
 37 while(!s.empty())
 38 {
 39 char temp = s.top();
 40 s.pop();
 41 if(temp != '(')
 42 {
 43 newexpr[j++] = temp;
 44 }
 45 else
 46 {
 47 ++i;
 48 break;
 49 }
 50 )
 51 break;
 52 
 53 case ' ':
 54 ++i;
 55 break;
 56 default :
 57 while(oldexpr[i] >= '0' && oldexpr[i] <= '9')
 58 {
 59 newexpr[j++] = oldexpr[i];
 60 ++i;
 61 }
 62 newexpr[j++] = '#';
 63 break;
 64 }
 65 )
 66 while(!s.empty())
 67 {
 68 newexpr[j++] = s.top();
 69 s.pop();
 70 }
 71 newexpr[j] = '\0';
 72 )
 73 
 74 int Calculate(char *expr)
 75 {
 76 int i=0;
 77 stack<int> data;
 78 int tmp;
 79 while(expr[i] != '\0')
 80 {
 81 tmp = 0;
 82 if(expr[i] >= '0' && expr[i] <= '9')
 83 {
 84 while(expr[i] >= '0' && expr[i]<='9')
 85 {
 86 tmp = tmp * 10 + expr[i++] - '0';
 87 }
 88 data.push(tmp);
 89 }
 90 else if(expr[i] == '#')
 91 ++i;
 92 else 
 93 {
 94 int a,b;
 95 a= data.top();
 96 data.pop();
 97 b= data.top();
 98 data.pop();
 99 switch(expr[i++])
100 {
101 case '+':
102 tmp = b+a;
103 data.push(tmp);
104 break;
105 case '-':
106 tmp = b-a;
107 data.push(tmp);
108 break;
109 case '*':
110 tmp = a*b;
111 data.push(tmp);
112 break;
113 case '/':
114 tmp = b/a;
115 data.push(tmp);
116 break;
117 }
118 }
119 }
120 return data.top();
121 }

 

posted @ 2018-11-24 19:48  执著的追求  阅读(169)  评论(0编辑  收藏  举报