題目:
利用棧編寫表達式求值程序:輸入含有“+”、“-”、“*”、“/”四則運算的表達式,其中負數要用(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; }