问题 L: 后缀表达式求值

题目描述

为了便于处理表达式,常常将普通表达式(称为中缀表示)转换为后缀{运算符在后,如X/Y写为XY/表达式。在这样的表示中可以不用括号即可确定求值的顺序,如:(P+Q)*(R-S) → PQ+RS-*。后缀表达式的处理过程如下:扫描后缀表达式,凡遇操作数则将之压进堆栈,遇运算符则从堆栈中弹出两个操作数进行该运算,将运算结果压栈,然后继续扫描,直到后缀表达式被扫描完毕为止,此时栈底元素即为该后缀表达式的值。

输入

输入一行表示后缀表达式,数与数之间一定有空格隔开(可能不只一个空格),最后输入@表示输入结束。
数据保证每一步的计算结果均为不超过100000的整数。

输出

输出一个整数,表示该表达式的值.

样例输入 Copy
14  3 20 5 / * 8 - + @
样例输出 Copy
18

代码实现

#include 
using namespace std;

int re(int aa,int bb,char ch)
{
    if(ch=='+')  return aa+bb;
    else if(ch=='-')  return aa-bb;
    else if(ch=='*')  return aa*bb;
    else if(ch=='/')  return aa/bb;
}

int main(){
	stack dig;
    stack op;
    char ch[100];
    int flag1=0,flag2=0,a;
    while( cin >> ch){
    	if(ch[0]=='@'){
    		cout << dig.top() << endl;
    		break;
		}
    	if(ch[0]=='+'||ch[0]=='-'||ch[0]=='*'||ch[0]=='/'){
    		flag1 = 1;
    		op.push(ch[0]);
		}else{
			flag2++;
			a = 0; 
			for(int i=0;ch[i]!='\0';i++){
				a=a*10+(ch[i]-48);
			}
			dig.push(a);
		}
		if(flag1 && flag2 >=2){
			int bb=dig.top();
			dig.pop();
			int aa=dig.top();
			dig.pop();
			char e = op.top();
			int result = re(aa,bb,e);
			dig.push(result);
			flag2--;
			flag1 = 0;
		}
	}
	return 0;
}

你可能感兴趣的:(算法)