3058. 链表运算

单点时限: 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值