//************ 课本53页,用栈来实现的简单的四则运算表达式. '#'是表达式结束符,
注意在表达式输入完毕后需再输入一个'#'表示结束. eg:4+2*3-10/5# **********//
#include<stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <stack>
using namespace std;
stack<int> opnd; //操作数栈
stack<char> optr; //算符栈
char expression[100]; //用于盛放表达式
char Compare(char a, char b); //返回两算符a和b的优先级关系
int Calculate(int a, int b, char op); //返回计算结果
int EvaluateExpression(); //求值过程
bool IsOptr(char c); //是否是算符
int main(){
optr.push('#'); //在表达式最左边增设一个'#'构成整个表达式的一对'#'
while(scanf("%s", expression) != EOF)
cout<<EvaluateExpression()<<endl;
return 0;
}
char Compare(char a, char b){ //返回两算符a和b的优先级关系
if('#' == a)
if('#' == b)
return '=';
else
return '<';
if('+'==a || '-'==a)
if('*'==b || '/'==b || '('==b)
return '<';
else
return '>';
if('*'==a || '/'==a)
if('(' == b)
return '<';
else
return '>';
if('(' == a)
if(')' == b)
return '=';
else
return '<';
}
int Calculate(int a, int b, char op) //返回计算结果
{
switch(op) {
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
case '/':
return a/b;
}
}
bool IsOptr(char c){
static string oprator("+-*/()#");
if(oprator.find(c) == string::npos)
return false; //不是算符
return true; //是算符
}
int EvaluateExpression(){ //求值过程
int i=0, num=0;
while(expression[i]!='#' || optr.top()!='#'){
if(!IsOptr(expression[i])){
//不是算符,则是操作数
num = 0;
while(!IsOptr(expression[i]))
{ //求得此操作数
num *= 10;
num += expression[i]-'0';
++i;
}
opnd.push(num);
}
else{
switch(Compare(optr.top(), expression[i])){
case '<':
optr.push(expression[i]);
++i;
break;
case '=':
optr.pop();
++i;
break;
case '>':
int a = opnd.top(); opnd.pop();
int b = opnd.top(); opnd.pop();
opnd.push(Calculate(b, a, optr.top())); //注意这里a和b的顺序
optr.pop();
break;
}
}
}
optr.push('#'); //在表达式最左边增设一个'#'构成整个表达式的一对'#'
int res=opnd.top();
opnd.pop();
return res;
}