Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
1、栈(Stack)是一种线性存储结构,它具有如下特点:
(1)栈中的数据元素遵守“先进后出"(First In Last Out)的原则,简称FILO结构。(后进先出的叫法,也是可以的)
(2)限定只能在栈顶进行插入和删除 *** 作。
2、栈的相关概念:
(1)栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。
(2)压栈:栈的插入 *** 作,叫做进栈,也称压栈、入栈。
(3)d栈:栈的删除 *** 作,也叫做出栈。
本题就运用了栈的数据结构,如果运算符是加法,则直接把那个数字压入栈里,如果是减法,则把那个数的相反数压入栈里,如果是乘法或除法,则取栈头的数相乘或相除,pop出后把结果push进去,最后就把栈中的数字相加就是结果。
#include
using namespace std;
int main()
{
double a;
char ch;
while(~scanf("%lf%c",&a,&ch))
{
if(a==0&&ch=='n')
break;
stack
s.push(a);
double ans=0;
while(scanf("%c %lf",&ch,&a))
{
if(ch=='+')
{
s.push(a);
}
else if(ch=='-')
{
s.push(-a);
}
else if(ch=='*')
{
double d=s.top()*a;
s.pop();
s.push(d);
}
else
{
double d=s.top()*1.0/a;
s.pop();
s.push(d);
}
char k=getchar();
if(k=='n')
{
break;
}
}
while(!s.empty())
{
ans=ans+s.top();
s.pop();
}
printf("%.2lfn",ans);
}
return 0;
}
数媒202 qxy
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)