逆波兰表达式

  1. 正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便。
  2. 例如:3 + 5 * (2 + 6) - 1
  3. 而且,常常需要用括号来改变运算次序。
  4. 相反,如果使用逆波兰表达式(前缀表达式)表示,上面的算式则表示为:
  5. - + 3 * 5 + 2 6 1
  6. 不再需要括号,机器可以用递归的方法很方便地求解。
  7. 为了简便,我们假设:
  8. 1. 只有 + - * 三种运算符
  9. 2. 每个运算数都是一个小于10的非负整数
  10. 下面的程序对一个逆波兰表示串进行求值。
  11. 其返回值为一个结构:其中第一元素表示求值结果,第二个元素表示它已解析的字符数。

struct EV

{

int result; //计算结果

int n; //消耗掉的字符数

};

struct EV evaluate(char* x)

{

struct EV ev = {0,0};

struct EV v1;

struct EV v2;

  1. if(*x==0) return ev;
  2. if(x[0]>='0' && x[0]<='9'){
  3. ev.result = x[0]-'0';
  4. ev.n = 1;
  5. return ev;
  6. }
  7. //- + 3 * 5 + 2 6 1
  8. v1 = evaluate(x+1);
  9. v2 = _____________________________; //填空位置
  10. if(x[0]=='+') ev.result = v1.result + v2.result;
  11. if(x[0]=='*') ev.result = v1.result * v2.result;
  12. if(x[0]=='-') ev.result = v1.result - v2.result;
  13. ev.n = 1+v1.n+v2.n;
  14. return ev;

}

请分析代码逻辑,并推测划线处的代码,通过网页提交。

注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!

答案:x+1+v1.n

测试程序:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct EV
  4. {
  5. int result; //计算结果
  6. int n; //消耗掉的字符数
  7. };
  8. struct EV evaluate(char* x)
  9. {
  10. struct EV ev = {0,0};
  11. struct EV v1;
  12. struct EV v2;
  13. if(*x==0) return ev;//到字符串结尾 返回值
  14. //如果当前是一个数字 而不是运算符 就计算结果
  15. if(x[0]>='0' && x[0]<='9'){
  16. ev.result = x[0]-'0';
  17. ev.n = 1;
  18. return ev;
  19. }
  20. v1 = evaluate(x+1);
  21. v2 = evaluate(x+1+v1.n); //填空位置
  22. if(x[0]=='+') ev.result = v1.result + v2.result;
  23. if(x[0]=='*') ev.result = v1.result * v2.result;
  24. if(x[0]=='-') ev.result = v1.result - v2.result;
  25. ev.n = 1+v1.n+v2.n;
  26. return ev;
  27. }
  28. int main(){
  29. char sss[] = "-+3*5+261";
  30. struct EV eee = evaluate(sss);
  31. cout<<eee.result<<endl;
  32. return 0;
  33. }

逆波兰表达式|2013年蓝桥杯A组题解析第六题-fishers的更多相关文章

  1. 黄金连分数|2013年蓝桥杯B组题解析第四题-fishers

    黄金连分数 黄金分割数0.61803... 是个无理数,这个常数十分重要,在许多工程问题中会出现.有时需要把这个数字求得很精确. 对于某些精密工程,常数的精度很重要.也许你听说过哈勃太空望远镜,它首次 ...

  2. 前缀判断|2013年蓝桥杯B组题解析第五题-fishers

    前缀判断 如下的代码判断 needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL. 比如:"abcd1234" 就包含了 &quo ...

  3. 奇怪的分式|2014年蓝桥杯B组题解析第六题-fishers

    奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念 ...

  4. 第六届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520, ...

  5. 第六届蓝桥杯JavaA组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...

  6. 带分数|2013年蓝桥杯B组题解析第九题-fishers

    带分数 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一次(不包含 ...

  7. 错误票据|2013年蓝桥杯B组题解析第七题-fishers

    错误票据 某涉密单位下发了某种票据,并要在年终全部收回. 因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号. 你的任务是通过编程,找出断号的ID和重号的ID. ...

  8. 第39级台阶|2013年蓝桥杯B组题解析第三题-fishers

    第39级台阶 小明刚刚看完电影<第39级台阶>,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个台阶.先迈左脚, ...

  9. 大臣的旅费|2013年蓝桥杯A组题解析第十题-fishers

    标题:大臣的旅费 很久以前,T王国空前繁荣.为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市. 为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市 ...

随机推荐

  1. 关于python中selector问题

    在做大型的爬虫时,re表达式往往效率不高,scrapy框架为爬虫提供了很好的爬虫方法 scrapy提取数据时有一套自己的机制,即selectors,一般通过特定的XPath,或者特定 的CSS表达式来 ...

  2. gispro试用版账户注册

    1.注册账户 http://www.esri.com/zh-cn/arcgis/products/arcgis-pro/trial 2.分配账户权限 3.gispro可以登录了

  3. Lua之math

    Lua之math函数: 转载请注明出处:http://www.cnblogs.com/jietian331/p/8032555.html abs 取绝对值 math.abs(-15) 15 acos ...

  4. ruby自动化之selenium webGUI

    1.下载ruby语言包,windows下需要安装rubyinstall http://railsinstaller.org/en 2.cmd命令下安装selenium-webdriver gem包 g ...

  5. Eclipse修改编码方式

    1.修改工作空间默认编码 1.修改工作空间默认编码:window -> preferences ->  General -> Workspace 2.修改文件的编码 在Eclipse ...

  6. VMWare虚拟机 window文件传递

    无论是将虚拟机的文件传到window上或者是将window上文件传到虚拟机上: 都可以选中文件,然后拖动文件到另一个系统上 提前:虚拟机安装了VMWARE Tools 1)window上文件拖到虚拟机 ...

  7. 安装模块时报错“error: Microsoft Visual C++ 14.0 is required…”

    安装pymssql时报错:在安装的过程中遇到了“error: Microsoft Visual C++ 14.0 is required…” 解决办法: 进入https://www.lfd.uci.e ...

  8. 通过百度api 获取当前城市3种方法

    方法一:function showLocation(data) { console.log(data.content); //alert(data.content.address_detail.cit ...

  9. php冒泡排序实现方法,传入几个数字排序后 输出实战例子

    php冒泡排序实现方法,传入几个数字排序后 输出实战例子 算法和数据结构是一个编程工作人员的内功.四种入门级排序算法: 冒泡排序.选择排序.插入排序.快速排序. 一.冒泡排序 原理:对一组数据,比较相 ...

  10. C#使用SmtpClient发送邮件

    目的:写一个可发送邮件的DLL. 原理: 例如A使用163邮箱发送邮件给B(qq邮箱).首先A会把邮件通过SMTP(Simple Mail Transfer Protocol)协议传输到163的Smt ...