题目链接:简单计算器
解题思路:这个题WA了一次,脑子不机密。。。。。两个栈,一个栈保存运算符号,一个保存操作数。遇到操作数就压进操作数的栈,遇到运算符就看如果是+-的话就把之前的全部运算符一一退栈,每退一个从操作数中取两个数做计算,再将结果再压回操作数的栈内。如果是*/的话,如果之前的操作符也是*/的话那就个上面一样方法。如果操作符栈没有元素就直接压进栈中。最后扫描完算式之后,将剩余操作符一一出栈运算,最后操作数栈中会剩余一个元素。那就是结果。如果有括号的话,左括号直接入栈,遇到右括号的话就相当于一小段式子结束,按上面的处理,直到遇到左括号。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<stack>
#define MAX 220
using namespace std;
char s[MAX];
stack<double> num;
stack<char> cal;
double getAns(double l, double r, char c){
if(c == '+'){
return l + r;
}
else if(c == '-'){
return l - r;
}
else if(c == '*'){
return l * r;
}
else{
return l / r;
}
}
int main(){
int i, j, k;
int tem;
char ch, c;
double l, r;
while(gets(s)){
if(strlen(s) == 1 && s[0] == '0'){
break;
}
bool flag = true;
i = 0;
while(i < strlen(s)){
if(flag){
sscanf(s + i, "%d", &tem);
num.push(1.0*tem);
if(tem == 0){
i += 2;
}
else{
i += log10(1.0 * tem) + 2;
}
flag = false;
}
else{
sscanf(s + i, "%c", &ch);
if((ch == '+' || ch == '-')){
while(!cal.empty()){
r = num.top();num.pop();
l = num.top();num.pop();
c = cal.top();cal.pop();
num.push(getAns(l, r, c));
}
cal.push(ch);
}
if((ch == '*' || ch == '/')){
while(!cal.empty() && (cal.top() == '*' || cal.top() == '/')){
r = num.top();num.pop();
l = num.top();num.pop();
c = cal.top();cal.pop();
num.push(getAns(l, r, c));
}
cal.push(ch);
}
i += 2;
flag = true;
}
}
while(!cal.empty()){
r = num.top();num.pop();
l = num.top();num.pop();
c = cal.top();cal.pop();
num.push(getAns(l, r, c));
}
printf("%.2lf\n", num.top());
num.pop();
}
return 0;
}