单点时限: 2.0 sec
内存限制: 256 MB
运算符前置的算术表达式则称为波兰式。例如普通的表达式 2 + 3 的波兰式为:+ 2 3。波兰式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序。
例如:(2.5+3)(-4) 的波兰式为: + 2.5 3 -4,而 5-6*7 的波兰式为:- 5 * 6 7。
现给定一个用单向链表存贮的波兰式,其节点以字符串形式存放运算符和运算数。运算符包括+,-,*,/ 四种,运算数是浮点数,每个运算数的宽度不超过 10。测试数据保证除法运算的除数不等于 0。
要求定义函数 Evaluate 计算一个表达式的值。
例如:波兰式 * + 2.5 3 -4 的存贮为:
Evaluate 的返回值为-22。
结构体类型 NODE 表示一个单向链表的节点定义。
输入格式
第 1 行:整数 () 为问题数。
第 2∽T+1 行:每一个问题一行数据(数据的意义不在这里描述)。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后在一行中输出相关数据(数据的意义不在这里描述)。
样例
input
3
3 2 +
-4 3 2.5 + *
7 6 * 5 -
output
case #0:
5.00
case #1:
-22.00
case #2:
-37.00
/*
思路:双端队列模拟,每次遇到运算符就抛出队尾两个元素,参加运算后在入队尾。
值得注意的是不知道一行什么时候停止,用输入一个字符串之后用getchar()接受一个字符,当getchar=='\n'时就break
*/
#include<iostream>
#include<queue>
using namespace std;
int main() {
int t;
cin>>t;
getchar();
for(int i = 0; i < t; i++) {
deque<float>q;
while(1) {
string s;
cin>>s;
if(s=="*"||s=="-"||s=="+"||s=="/") {
float x=q.back();
q.pop_back();
float y=q.back();
q.pop_back();
if(s=="-")
q.push_back(x-y);
else if(s=="+")
q.push_back(x+y);
else if(s=="*")
q.push_back(x*y);
else
q.push_back(x/y);
} else
q.push_back(stof(s));
char ch=getchar();
if(ch=='\n')
break;
}
printf("case #%d:\n%.2f\n",i,q.front());
q.clear();
}
return 0;
}