模拟简单运算器得工作,假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的
优先级相同,按从左到右的顺序计算。[^1]
【输入格式】
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数,遇到等号"=“说明输入结束。
【输出格式】
在一行中输出算式结果,或者如果除法分母为0或非法运算符,则输出错误"ERROR”.
【输入样例】
1+2*10-10/2=
【输出样例】
10
#inclde<iostream>
using namespace std;
int main()
{
int a;
char b=' ';
double ans;
cin>>ans;
while(b!='=')
{
if(b=='+')
{
cin>>a;
ans+=a;
b=getchar();
}
else if(b=='*')
{
cin>>a;
ans*=a;
b=getchar();
}
else if(b=='-')
{
cin>>a;
ans-=a;
b=getchar();
}
else if(b=='/')
{
cin>>a;
if(a==0)
{
cout<<"ERROR";
return 0;
}
ans/=a;
b=getchar();
}
else if(b==' ')
b=getchar();
else
cout<<"ERROR";
}
cout<<ans;
}
[^1]:处降低题目的难度
下面是优先级不同时的情况:为实现运算符优先算法,可以使用两个工作栈。一个称做
OPTR,用以寄存运算符;另一个称为OPND,用以寄存操作数或结果。算法的基本思想是:
(1) 首先置操作数栈为空栈,表达式起始符"#“为运算符栈的栈顶元素;
(2) 依次读入表达式中每个字符,若是操作数则进OPND栈,若是运算符则和OPTR栈
的栈顶元素比较优先权后作相应操作,至到整个表达式求值完毕(即OPTR)栈顶元素和当前读入的字符均位”#"
operandType EvaluateExpression()
{
InitStack(OPTR);
Push(OPTR,"#");
initStack(OPND);
c=getchar();
while(c!='#'||GetTop(OPTR)!='#')
{
if(!In(c,OP))
{
Push((OPND,c