简单计算器
http://codeup.cn/problem.php?cid=100000605&pid=0
前言:
一道典型的Stack(栈)的应用题,思路简单,但是比较考验编码能力(有很多编码细节,一不注意,你就没了QAQ)
PS:杭电也有这样的题,长得几乎一模一样,但是不知道为什么杭电上AC的代码Codeup上这道题就是过不了,大雾???(stack做出后,在看其他解法的时候发现的)
题目简述:
计算表达式中只含有+、-、×、/,计算给出的表达式的值,保留小数点后两位输出。
输入中含有数字、空格、计算符、回车。
当一行输入中只含0时,输入结束。
解题思路:
遇到这种表达式求值的题,一般就是将中缀表达式转换为后缀表达式,然后用两个stack分别存储运算符和数字,根据计算符的优先级进行弹出运算。
注意:大多数题目中还是会涉及到括号的情况,只不过这道题难度降了(我依旧编了很久很久)。如果有括号,则还要判断括号的优先级!
代码Code:
#include <bits/stdc++.h>
using namespace std;
stack<char> op; //存运算符
stack<double> num; //存数字
char s[10001];
inline int check(char ops) { //比较运算符的优先级
if(ops=='*'||ops=='/') return 2;
if(ops=='+'||ops=='-') return 1;
}
int main() {
while(gets(s)!=NULL&&strcmp("0",s)) { //strcmp为字符串比较函数,此处为比较s与0是否完全相等
int i=0,t=0;
while(s[i]||!op.empty()) { //注意,是||不是&&
if(s[i]==' ') i++; //直接跳过空格
else if(s[i]>='0'&&s[i]<='9') { //处理数字
t=t*10+s[i]-'0';
i++;
if(!(s[i]>='0'&&s[i]<='9')) { //一段数字处理完了就存进num中
num.push(t);
t=0; //记得清零
}
}
else if(op.empty()||check(s[i])>check(op.top())){
//处理符号(如果op栈为空,则直接存入;否则根据优先级,优先级大就存入)
op.push(s[i]);
i++;
}
else {
char opss=op.top();
double x=num.top();
num.pop();
double y=num.top();
num.pop();
if(opss=='*') num.push(x*y);
else if(opss=='/') num.push(y/x); //注意一下除法和减法,因为是后缀
else if(opss=='+') num.push(x+y);
else num.push(y-x);
op.pop();
}
}
printf("%.2lf
",num.top());
}
return 0;
}
后序:
网上很多人是用两个queue或者一个queue+stack做的,在此就不多赘述了。
提供一个用两个queue做的题解,宣传一下qwq:
https://www.cnblogs.com/bzzs/p/13049194.html