https://github.com/Lanying0/lintcode

所属:

数据结构->线性结构->栈

问题:

给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号)。

样例
对于 [3 - 4 + 5]的表达式(该表达式可表示为["3", "-", "4", "+", "5"]),返回 [3 4 - 5 +](该表达式可表示为 ["3", "4", "-", "5", "+"])。

 思路:

逆波兰的一般思路,对于输入的字符串,构建两个栈,一个栈中暂存运算符号,另一个栈中存表达式结果。

从头到尾一遍扫描字符串:遇到运算数,则直接压入表达式结果栈;遇到运算符,则要根据运算符优先级分情况处理。

运算符情况:1.左括号:直接压入符号栈。

2.加号、减号,优先级最低,所以要将栈中的加减乘除号先出栈到表达式结果栈,再将加减号入栈。

      3.乘号、除号,优先级最高,所以只需将栈中的乘除号出栈到表达式结果栈,再将此次的乘除号入栈。

      4.右括号:将栈中左括号之后入栈的运算符全部出栈到表达式结果栈,左括号出栈。

一遍扫描后,若符号栈不为空,则将其全部出栈到表达式结果栈。即为所求。

代码:

  1. class Solution {
  2. public:
  3. /**
  4. * @param expression: A string array
  5. * @return: The Reverse Polish notation of this expression
  6. */
  7. vector<string> convertToRPN(vector<string> &expression) {
  8. // write your code here
  9. vector<string>op;//符号栈
  10. vector<string>num;//表达式结果栈
  11. for(int i=0;i<expression.size();i++)//一遍扫描
  12. {
  13. if(expression[i]=="+" || expression[i]=="-")//处理加号、减号
  14. {
  15. if(op.size()==0)
  16. op.push_back(expression[i]);
  17. else
  18. {
  19. while(op.size()!=0 && (op[op.size()-1]=="*" || op[op.size()-1]=="/" ||op[op.size()-1]=="+" || op[op.size()-1]=="-"))
  20. {
  21. string s=op.back();
  22. op.pop_back();
  23. num.push_back(s);
  24.  
  25. } op.push_back(expression[i]);
  26. }
  27. if(op[op.size()-1]=="(")
  28. {
  29. op.push_back(expression[i]);
  30. }
  31. }
  32. else if(expression[i]=="*" || expression[i]=="/")//处理乘号、除号
  33. {
  34. if(op.size()==0)
  35. op.push_back(expression[i]);
  36. else if(op[op.size()-1]=="*" || op[op.size()-1]=="/" )
  37. {
  38. string s=op.back();
  39. op.pop_back();
  40. num.push_back(s);
  41. op.push_back(expression[i]);
  42. }
  43. else if(op[op.size()-1]=="+" || op[op.size()-1]=="-")
  44. {
  45. op.push_back(expression[i]);
  46. }
  47. else if(op[op.size()-1]=="(")
  48. {
  49. op.push_back(expression[i]);
  50. }
  51. }
  52. else if(expression[i]=="(")//处理左括号
  53. {
  54. op.push_back(expression[i]);
  55. }
  56. else if(expression[i]==")")//处理右括号
  57. {
  58. while(op.back()!="(")
  59. {
  60. string s=op.back();
  61. op.pop_back();
  62. num.push_back(s);
  63. }
  64. op.pop_back();
  65. }
  66. else//运算数直接压入表达式结果栈
  67. {
  68. num.push_back(expression[i]);
  69. }
  70. }
  71. while(op.size()!=0)//符号栈仍有符号时,将其压入表达式结果栈
  72. {
  73. string s=op.back();
  74. op.pop_back();
  75. num.push_back(s);
  76. }
  77. return num;
  78. }
  79. };

  

c++实现将表达式转换为逆波兰表达式的更多相关文章

  1. shunting-yard 调度场算法、中缀表达式转逆波兰表达式

    中缀表达式 1*(2+3) 这就是一个中缀表达式,运算符在数字之间,计算机处理前缀表达式和后缀表达式比较容易,但处理中缀表达式却不太容易,因此,我们需要使用shunting-yard Algorith ...

  2. 关于利用STL栈求解四则中缀表达式以及中缀表达式转逆波兰表达式和逆波兰表达式的求解

    今天总结一下栈的一个重要应用---四则数学表达式的求解 数学表达式的求解是栈的一个重要的应用,在计算机的应用中 如果求解一个四则运算表达式,我们可能会直接写一个程序例如什么printf("% ...

  3. SDIBT2666——逆波兰表达式求值

    逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...

  4. JavaScript实现计算后缀表达式(逆波兰表达式)以及将中缀表达式转为后缀表达式

    逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的表达式 逆波兰表达式 a+b ...

  5. noi1696 逆波兰表达式

    1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...

  6. 150. Evaluate Reverse Polish Notation逆波兰表达式

    [抄题]: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are ...

  7. C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)

    1.介绍 后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后 2.举例说明 (3+4)*5-6对应的后缀表达式就是3 4 +5 * 6 - 3.示例 输入一个逆波兰表达式(后缀表达 ...

  8. 【python】Leetcode每日一题-逆波兰表达式求值

    [python]Leetcode每日一题-逆波兰表达式求值 [题目描述] 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说 ...

  9. AC日记——逆波兰表达式 openjudge 3.3 1696

    1696:逆波兰表达式 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式 ...

随机推荐

  1. windows.h与winsock2.h的包含顺序

    #define WIN32_LEAN_AND_MEAN #include <windows.h>

  2. Mysql表锁定解决

    #查看进程SELECT *FROM information_schema.processlistWHERE USER = 'root' AND state LIKE 'Waiting%';#杀掉进程K ...

  3. 基于jQuery的Jsonp跨域[Get方式]

    由于目前的项目需要无刷新的跨域操作数据,整理了下自己使用的基于jQuery的Jsonp跨域[Get方式]. 代码如下: Javascript部分 $(function(){ $.ajax({ asyn ...

  4. 使QQ窗口八字形转圈

    //先有思路 后有代码 总是不知不觉中乱敲一通 今天做个标记 感谢老师课堂上的讲解#include <stdio.h> #include <math.h> #include & ...

  5. JPEG图像密写研究(一) JPEG图像文件结构

    [转载]转载自http://www.cnblogs.com/leaven/archive/2010/04/06/1705846.html JPEG压缩编码算法的主要计算步骤如下: (0) 8*8分块. ...

  6. RedMine 版本管理工具

    一.介绍: Redmine 是一个开源的.基于Web的项目管理和缺陷跟踪工具.它用日历和甘特图辅助项目及进度可视化显示.同时它又支持多项目管理.Redmine是一个自由开放 源码软件解决方案,它提供集 ...

  7. Enabling Process Accounting on Linux HOWTO

    http://tldp.org/HOWTO/Process-Accounting/index.html

  8. Xcode 3.2.5免证书开发调试

    Xcode 3.2.5免证书开发调试 xcode3.2.5 应该没人用了.这里做个保存而已. Xcode编译遇到过 Code Sign error: a valid provisioning prof ...

  9. Brew install for mac

    安装命令例如以下: curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --st ...

  10. Android 启动Activity的方式

    Activity的启动分为两种方式,显示方式和隐式方式,显示方式就是在通过intent启动Activity时指定了Activity的包名和类名. 而隐式方式则在初始化Intent时仅仅指定action ...