题目:
利用栈编写表达式求值程序:输入含有“+”、“-”、“*”、“/”四则运算的表达式,其中负数要用(0-正数)表示,并以=结束。要求输出表达式的值。
输入格式
第一行:一个算术表达式
输出格式
第一行:算术表达式的值
输入样例
3*(9-7)=
输出样例
6
代码:
#include<stdio.h> #include<iostream> #include<stack> using namespace std; int In(char ch) // 判断是否为字母 { if(ch>=48&&ch<=57) return 1; else return 0; } char compare(char a,char b) // 比较两个符号的优先顺序 { int i,j; char c[7]= {'+','-','*','/','(',')','#'}; char d[7][7]= { {'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=','@'}, {'>','>','>','>','@','>','>'}, {'<','<','<','<','<','@','='}, }; if(b=='=') return '>'; for(i=0; c[i]!=a; i++); for(j=0; c[j]!=b; j++); return d[i][j]; } int claculat(int a,char op,int b) // 计算表达式,注意计算顺序与栈的关系 { int m; if(op=='+') m=a+b; if(op=='-') m=a-b; if(op=='*') m=a*b; if(op=='/') m=a/b; return m; } int main() { stack<int> OPND; // 数字栈,用于存储数据 stack<char> OPTR; // 符号栈, 用于存储计算符号 char c, top, op; int temp,m,n, result; c = getchar(); OPTR.push('#'); // 一开始时,符号栈中并没有符号,而在接下来的循环中,需要比较两个运算符号的优先顺序,
// 所以有必要先在符号栈中存入一个符号,而这个符号的运算级别必须小于其他符号。 while(c!='='||OPTR.top()!='#') { // 输入‘=’, 则退出循环。 if(In(c)) { // 输入数字,一个一个数字输入,转化为正确的数值,并存入数字栈 temp=c-'0'; c=getchar(); while(In(c)) { temp=temp*10+c-'0'; c=getchar(); } OPND.push(temp); } else { top = OPTR.top(); switch (compare(top , c)) { case '<': //若运算极较小, 则入栈 OPTR.push(c); c = getchar(); break; case '=': //若运算级别相等(为两个括号) 则出栈 OPTR.pop(); c = getchar(); break; case '>': // 若运算级别较大,则数字栈出栈,计算两个数字的算术结果,并存入栈中 m = OPND.top(); OPND.pop(); n = OPND.top(); OPND.pop(); op = OPTR.top(); OPTR.pop(); result = claculat(n, op, m); OPND.push(result); break; } } } printf("%d\n",OPND.top()); return 0; }