只有加减乘除的简单计算器
注意只有当当前运算符的优先级大于栈顶的时候才可以入栈,等于不可以,因为运算从左到右,相同优先级先算栈里的符号
还有向操作数栈压数的时候,要先压符号后压数
#include<iostream>
#include<cstdio>
#include<stack>
#include<map>
using namespace std;
double num;
char op;
const int N=110;
double s[N];
int n;
map<char,int> mp;
void pre()
{
mp['+']=mp['-']=0;
mp['*']=mp['/']=1;
}
double calc(double a,char op,double b)
{
switch(op)
{
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
}
}
int main()
{
pre();
while(scanf("%lf",&num)!=EOF)
{
stack<double>q;
stack<char>p;
q.push(num);
op=getchar();
if(op=='\n') break;
while(1)
{
scanf("%c %lf",&op,&num);
if(p.empty()||mp[op]>mp[p.top()])
{
// cout<<'a'<<endl;
//if(!p.empty()) cout<<op<<' '<<mp[op]<<' '<<mp[p.top()]<<endl;
p.push(op);
q.push(num);
}
else
{
//cout<<'b'<<endl;
while(!p.empty()&&mp[op]<=mp[p.top()])
{
char c=p.top();
p.pop();
double b=q.top();q.pop();
double a=q.top();q.pop();
//cout<<calc(a,c,b)<<endl;;
q.push(calc(a,c,b));
}
p.push(op);
q.push(num);
}
char x=getchar();
if(x=='\n') break;
}
while(!p.empty())
{
char c=p.top();
p.pop();
double b=q.top();q.pop();
double a=q.top();q.pop();
q.push(calc(a,c,b));
}
printf("%.2f\n",q.top());
}
return 0;
}