棧的應用---表示式求值
阿新 • • 發佈:2021-02-07
題目描述:
讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
輸入:
測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過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;
}