计算表达式 C++题解
注意:
- 符号栈首先压入'#',字符串最后添加'$',保证所有运算符都用于运算。
- 栈顶运算符优先级小于当前运算符优先级时,当前运算符入栈;否则进行二元运算。
- 字符串型数字读取:while循环读入数字字符并转换为数字类型,注意循环时的进位操作。
- 由于存在除法,所有数字都设为double型!!!不然debug很长时间也找不到bug。
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int getLevel(char ch){
int level;
if(ch == '#')
level = 0;
else if(ch == '$')
level = 1;
else if(ch == '+' || ch == '-')
level = 2;
else if(ch == '*' || ch == '/')
level = 3;
return level;
}
double calculate(double x, double y, char ch){
double res;
if(ch=='+')
res = x + y;
else if(ch=='-')
res = x - y;
else if(ch=='*')
res = x * y;
else if(ch=='/')
res = x / y;
return res;
}
int main(){
string str;
while(getline(cin,str)){
str += '$';
int index = 0;
stack<double> num;
stack<char> op;
op.push('#');
while(index<str.length()){
if(isdigit(str[index])){
double number = 0;
while(isdigit(str[index])){
number = number*10 + str[index] - '0';
index++;
}
num.push(number);
}else{
char ch = str[index];
if(getLevel(op.top())<getLevel(ch)){
op.push(ch);
index++;
}
else{
double y = num.top();
num.pop();
double x = num.top();
num.pop();
double res = calculate(x, y ,op.top());
num.push(res);
op.pop();
}
}
}
cout << num.top() << endl;
}
return 0;
}