c++实现将表达式转换为逆波兰表达式
https://github.com/Lanying0/lintcode
所属:
数据结构->线性结构->栈
问题:
给定一个表达式字符串数组,返回该表达式的逆波兰表达式(即去掉括号)。
样例
对于 [3 - 4 + 5]的表达式(该表达式可表示为["3", "-", "4", "+", "5"]),返回 [3 4 - 5 +](该表达式可表示为 ["3", "4", "-", "5", "+"])。
思路:
逆波兰的一般思路,对于输入的字符串,构建两个栈,一个栈中暂存运算符号,另一个栈中存表达式结果。
从头到尾一遍扫描字符串:遇到运算数,则直接压入表达式结果栈;遇到运算符,则要根据运算符优先级分情况处理。
运算符情况:1.左括号:直接压入符号栈。
2.加号、减号,优先级最低,所以要将栈中的加减乘除号先出栈到表达式结果栈,再将加减号入栈。
3.乘号、除号,优先级最高,所以只需将栈中的乘除号出栈到表达式结果栈,再将此次的乘除号入栈。
4.右括号:将栈中左括号之后入栈的运算符全部出栈到表达式结果栈,左括号出栈。
一遍扫描后,若符号栈不为空,则将其全部出栈到表达式结果栈。即为所求。
代码:
class Solution {
public:
    /**
     * @param expression: A string array
     * @return: The Reverse Polish notation of this expression
     */
    vector<string> convertToRPN(vector<string> &expression) {
        // write your code here
        vector<string>op;//符号栈
        vector<string>num;//表达式结果栈
        for(int i=0;i<expression.size();i++)//一遍扫描
        {
            if(expression[i]=="+" || expression[i]=="-")//处理加号、减号
            {
                if(op.size()==0)
                    op.push_back(expression[i]);
                else
                {
                while(op.size()!=0 && (op[op.size()-1]=="*" || op[op.size()-1]=="/" ||op[op.size()-1]=="+" || op[op.size()-1]=="-"))
                {
                    string s=op.back();
                    op.pop_back();
                    num.push_back(s);
                } op.push_back(expression[i]);
                }
                if(op[op.size()-1]=="(")
                {
                    op.push_back(expression[i]);
                }
            }
            else if(expression[i]=="*" || expression[i]=="/")//处理乘号、除号
            {
                 if(op.size()==0)
                    op.push_back(expression[i]);
                else if(op[op.size()-1]=="*" || op[op.size()-1]=="/" )
                {
                    string s=op.back();
                    op.pop_back();
                    num.push_back(s);
                    op.push_back(expression[i]);
                }
                 else if(op[op.size()-1]=="+" || op[op.size()-1]=="-")
                {
                    op.push_back(expression[i]);
                }
                 else if(op[op.size()-1]=="(")
                {
                    op.push_back(expression[i]);
                }
            }
            else if(expression[i]=="(")//处理左括号
            {
                    op.push_back(expression[i]);
            }
            else if(expression[i]==")")//处理右括号
            {
                while(op.back()!="(")
                {
                    string s=op.back();
                    op.pop_back();
                    num.push_back(s);
                 }
                 op.pop_back();
            }
            else//运算数直接压入表达式结果栈
            {
                num.push_back(expression[i]);
            }
        }
        while(op.size()!=0)//符号栈仍有符号时,将其压入表达式结果栈
        {
            string s=op.back();
            op.pop_back();
            num.push_back(s);
        }
        return num;
    }
};
c++实现将表达式转换为逆波兰表达式的更多相关文章
- shunting-yard 调度场算法、中缀表达式转逆波兰表达式
		
中缀表达式 1*(2+3) 这就是一个中缀表达式,运算符在数字之间,计算机处理前缀表达式和后缀表达式比较容易,但处理中缀表达式却不太容易,因此,我们需要使用shunting-yard Algorith ...
 - 关于利用STL栈求解四则中缀表达式以及中缀表达式转逆波兰表达式和逆波兰表达式的求解
		
今天总结一下栈的一个重要应用---四则数学表达式的求解 数学表达式的求解是栈的一个重要的应用,在计算机的应用中 如果求解一个四则运算表达式,我们可能会直接写一个程序例如什么printf("% ...
 - SDIBT2666——逆波兰表达式求值
		
逆波兰表达式求值(栈和队列) Description 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序.规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+ ...
 - JavaScript实现计算后缀表达式(逆波兰表达式)以及将中缀表达式转为后缀表达式
		
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的表达式 逆波兰表达式 a+b ...
 - noi1696 逆波兰表达式
		
1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术 ...
 - 150. Evaluate Reverse Polish Notation逆波兰表达式
		
[抄题]: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are ...
 - C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)
		
1.介绍 后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后 2.举例说明 (3+4)*5-6对应的后缀表达式就是3 4 +5 * 6 - 3.示例 输入一个逆波兰表达式(后缀表达 ...
 - 【python】Leetcode每日一题-逆波兰表达式求值
		
[python]Leetcode每日一题-逆波兰表达式求值 [题目描述] 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说 ...
 - AC日记——逆波兰表达式 openjudge 3.3 1696
		
1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式 ...
 
随机推荐
- 《javascript dom编程艺术》笔记(一)——优雅降级、向后兼容、多个函数绑定onload函数
			
刚刚开始自学前端,如果不对请指正:欢迎各位技术大牛指点. 开始学习<javascript dom编程艺术>,整理一下学习到的知识.今天刚刚看到第六章,记下get到的几个知识点. 优雅降级 ...
 - 如何获取fragment里的控件
			
不能在onCreate函数中获取控件,以为fragment还没有start,你可以在onStart函数中获取: @Overrideprotected void onStart() { super.on ...
 - Xampp Linux应用
			
一.基本操作: 1.Xampp安装包下载: https://www.apachefriends.org/index.html 2.安装与配置: 将xampp-linux-x64-5.6.3 ...
 - JS中特殊句子-with
			
1 with 语句 为一个或一组语句指定默认对象. 用法:with (<对象>) <语句>; with 语句通常用来缩短特定情形下必须写的代码量.在下面的例子中,请注意 Mat ...
 - DEM 数据下载
			
https://centaurus.caf.dlr.de:8443/short_guide/index.html https://centaurus.caf.dlr.de:8443/eoweb-ng/ ...
 - Office 2010 Toolkit and EZ-Activator
			
“Office 2010 Toolkit 2.0.1”是“迷你KMS”的更新换代版本.虽然是单一可执行程序,但一身承担两大职能:“KMS服务器”和“客户激活端”.“Office 2010 Toolki ...
 - Genymotion中SD卡目录在Eclipse中查看,以及创建SDCard
			
咦?这后面似乎指向一个目录,我就去找/mnt/shell/emulated/0 Wow~好熟悉的目录..不熟悉的同学可以打开android模拟器的File Manger App 里面就是这些目录了,然 ...
 - Android 屏幕适配方式
			
适配:即当前应用在相同的手机上面显示相同的效果.适配前需要首先确定当前手机所属像素密度类型(如:xhdpi.hdpi.mdpi等) 像素密度:每英寸上分布的像素点个数,单位(dpi,ppi),利用勾股 ...
 - ObjectiveC中的block用法解析
			
Block Apple 在C, Objective-C,C++加上Block这个延申用法.目前只有Mac 10.6 和iOS 4有支持.Block是由一堆可执行的程序组成,也可以称做没有名字的Func ...
 - .Net 利用消息在进程间通讯实现进程互操作
			
有时候我们会遇到需要在两个进程间通过某种方式实现互操作,方法有很多,例如你可以尝试让两个进程持续监视一个外部文件,由此文件记录各自进程的数据:还有可以使用网络端口实现进程间通讯.共享一片内存区域记录及 ...