题目描述

先说明一下什么是中缀式:

如2+(3+4)*5这种我们最常见的式子就是中缀式。

而把中缀式按运算顺序加上括号就是:(2+((3+4)*5))

然后把运算符写到括号前面就是+(2 *( +(3 4) 5) )

把括号去掉就是:+ 2 * + 3 4 5

最后这个式子就是该表达式的前缀表示。

给你一个前缀表达式,请你计算出该前缀式的值。

比如:

+ 2 * + 3 4 5的值就是 37

 

输入

有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。
以EOF为输入结束的标志。

 

输出

对每组数据,输出该前缀表达式的值。输出结果保留两位小数。

 

样例输入

+ 2 * + 3 4 5
+ 5.1 / 3 7

样例输出

37.00
5.53

将中缀表达式转换为前缀表达式

转换步骤如下:

  1. 初始化两个栈:运算符栈s1,储存中间结果的栈s2
  2. 从右至左扫描中缀表达式
  3. 遇到操作数时,将其压入s2
  4. 遇到运算符时,比较其与s1栈顶运算符的优先级
    1. 如果s1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈
    2. 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入s1
    3. 否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较
  5. 遇到括号时
    1. 如果是右括号“)”,则直接压入s1
    2. 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃
  6. 重复步骤2至5,直到表达式的最左边
  7. 将s1中剩余的运算符依次弹出并压入s2
  8. 依次弹出s2中的元素并输出,结果即为中缀表达式对应的前缀表达式

计算方法:

将得到的字符串处理为只含有数字和运算符

将处理后的字符串从前到后压如栈S1中

将栈S1中的元素逐个弹出

若弹出元素判断为数字   压入栈S2中

若弹出元素判断为运算符   从栈S2中弹出两个元素   与该运算符进行运算    将运算结果重新压入栈S2中

处理完S1中所有元素后    S2栈顶元素即为计算结果

#include <iostream>
#include <stack>
#include <cstdlib>
#include <iomanip>
using namespace std;

double calculate(char c,double l,double r)
{
switch(c)
{
case '+':
return l+r;
case '-':
return l-r;
case '*':
return l*r;
case '/':
return l/r;
}
return 0;
}

int main()
{
string s;
stack<double> num;
while(getline(cin,s))
{
for(int i=s.length()-1;i>=0;--i)
{
if(s[i]==' ')//因为输入的每个字符有空格隔开,所以要忽略空格
continue;
else if(isdigit(s[i]))//如果是数字
{
while(isdigit(s[i])||s[i]=='.')//这个数字可能是小数或者数字不止一位
--i; //要找到这个数第一个数字的位置
i++; //前面返回的是第一个数的前一个位置
double t_num=atof(&s[i]); //那这个数转成数字压栈
num.push(t_num);
}
else//如果是操作符,就把栈里面靠近栈定的两位元素取出来
{//做运算,然后再把结果压栈
double l=num.top();
num.pop();
double r=num.top();
num.pop();
num.push(calculate(s[i],l,r));
}
}//for
cout<<setiosflags(ios::fixed)<<setprecision(2)<<num.top()<<endl;
num.pop();
}//while
return 0;
}

最新文章

  1. Cowboy 开源 WebSocket 网络库
  2. laravel5 安装笔记
  3. poj1006Biorhythms(同余定理)
  4. linux命令分享(四):iostat
  5. network config
  6. OpenWrt资料汇总
  7. 解决SharePoint文档库文件在搜索结果页面显示的标题和文档的标题不一致问题(search result)
  8. localStrorage、 sessionStorage 、cookie
  9. 通过配置Windows 防火墙允许使用TCP/IP协议远程访问数据库
  10. Nodejs.Electron(Nodejs的图形界面开发)安装和试用
  11. DOTween-Ease缓动函数
  12. [hbase] hbase 基础使用
  13. CSS样式简介
  14. [R]统计工具包
  15. PHP mysqli方式连接类
  16. Mac OS X 10.8.5 安装编译glib
  17. Unity3D笔记十三 摄像机之间切换
  18. php函数的实现
  19. [洛谷P2444] [POI2000]病毒
  20. Android网络请求之OkHttp框架

热门文章

  1. Blog Post Rating CodeForces - 806E (线段树二分)
  2. poj3080kmp或者暴力
  3. python-day47--mysql数据备份与恢复
  4. vijos 1423 最短路or环(有向图)
  5. 生成输出 URL(16.2)
  6. Oracle12c中多宿主环境(CDB&amp;amp;PDB)的数据库触发器(Database Trigger)
  7. 从零开始学习Vue(一)
  8. SQL Server 调优系列进阶篇 - 如何维护数据库索引
  9. 返回书签 GotoBookmark
  10. Java——IO类,转换流简化写法