1. 程式人生 > 其它 >棧的應用---表示式求值

棧的應用---表示式求值

技術標籤:演算法表示式求值

題目描述:
讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。

輸入:
測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。

輸出:
對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。

樣例輸入:

1 + 2
4 + 2 * 5 - 7 / 11
0

樣例輸出:

3.00
13.36

*/

程式碼:


#include <iostream>
#include<stack>
#include<string>
using namespace std; //得到一個完整的數字,例如表示式中有11,123等等 double get_number(string str,int &index){ double num=0; while(isdigit(str[index])){ num=num*10+str[index]-'0'; index++; } return num; } //設定優先順序 int prior(char c){ if(c=='#'){ return 0; } else if(c=='$'){ return 1; } else if(c=='+'||c==
'-'){ return 2; } else { return 3; } } //表示式求值的函式 double calculate(double x,double y,char op){ if(op=='+'){ return x+y; } else if(op=='-'){ return x-y; } else if(op=='*'){ return x*y; } else if(op=='/'){ return x/y; } } int main
() {string s1; while(getline(cin,s1)){ if(s1=="0"){//退出程式的出口 break; } int index=0;//遍歷表示式的索引 stack<char>oper; stack<double>number; oper.push('#');//運算元棧首先加入# s1+='$';//表示式末尾加上$符號表示結束 while(index<s1.size()){ if(s1[index]==' '){ index++; } else if(isdigit(s1[index])){//如果某一位是數字,得到整個數字。 double num=get_number(s1,index); number.push(num); } else if(prior(s1[index])<=prior(oper.top())){ char op=oper.top(); oper.pop(); double y=number.top(); number.pop(); double x=number.top(); number.pop(); double result=calculate(x,y,op); number.push(result); /* 這裡如果入棧結果會出錯,也即如果表示式操作符優先順序低於棧頂,棧頂操作符出棧計算結果後, 表示式操作符此時不能壓入操作符棧,需要繼續和此時新的操作符棧頂元素比較優先順序 */ //oper.push(s1[index]); //index++; } else { oper.push(s1[index]); index++; } } printf("%.2f\n",number.top()); } return 0; }