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;
    }
};

  

时间: 2024-11-03 21:20:12

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

后缀表达式(逆波兰表达式)计算器

package datastructure.stack; import java.util.*; /** * <h3>netty_lecture</h3> * <p>逆波兰计算器</p> * 1+((2+3)*4)-5 ==> 1 2 3 + 4 * + 5 1 * @author : myron * @date : 2020-03-18 23:48 **/ public class PolandNotation { private static fi

逆波兰表达式的实现(也叫后缀表达式)

本文主要偏重实现如何将字符串表达式转换为逆波兰表达式. 关于其讲解参考我转载的一篇博文:http://www.cnblogs.com/vpoet/p/4659546.html 先说说优先级: ()    +-     */%(从左到右递增) 下面先简单再梳理一下: 1.建立两个栈,一个为N(数据栈),一个为OP(运算符栈) 2.将字符串从左向右遍历,把数据压入数据栈,把运算符压入运算符的栈   关于运算符压栈的规则:⑴ 如果OP为空直接将运算符压入栈 ⑵ 如果不为空,则比较待入栈元素和栈顶元素的

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

逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出.逆波兰表达式又叫做后缀表达式.这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子: 正常的表达式 逆波兰表达式 a+b ---> a,b,+ a+(b-c) ---> a,b,c,-,+ a+(b-c)d ---> a,d,b,c,-,,+ a=1+3 ---> a=1,3 + http=(smtp+http+telnet)/1024 写成什么呢? http=smtp,http,telnet,+,+,1

noi1696 逆波兰表达式

1696:逆波兰表达式 http://noi.openjudge.cn/ch0303/1696/ 总时间限制:  1000ms 内存限制:  65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间

北京大学 程序设计与算法(二)逆波兰表达式

用递归解决递归形式的问题 逆波兰表达式 逆波兰表达式是一种把运算符前置的算数表达式,例如普通的表达式2+3的逆波兰表示法为+2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2+3)*3的逆波兰表示法为*+234.本题求解逆波兰表达式的值,其中运算符包括+-*/四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算符是浮点数 输出 输出为一行,表达式的值. *+11.0 12.0 +24.0 35.0 --à(11.0+12.0)*(24.0+3

逆波兰表达式

1696:逆波兰表达式 总时间限制: 1000ms 内存限制: 65536kB 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4.本题求解逆波兰表达式的值,其中运算符包括+ - * /四个. 输入 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数. 输出 输出为一行,表达式的值.可直接用prin

C++实现 逆波兰表达式计算问题

C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack { private: int size; int top; float *listArray; public: Stack(int sz=20); ~Stack(); bool push(float it);//入栈 bool pop(float& it);//出栈 bool isEmpty();//

逆波兰表达式(后缀表达式)

前/中/后缀表达式的转换 自然表达式转换为前/中/后缀表达式,其实是很简单的.首先将自然表达式按照优先级顺序,构造出与表达式相对应的二叉树,然后对二叉树进行前/中/后缀遍历,即得到前/中/后缀表达式. 举例说明将自然表达式转换成二叉树: a×(b+c)-d ① 根据表达式的优先级顺序,首先计算(b+c),形成二叉树 ②然后是a×(b+c),在写时注意左右的位置关系 ③最后在右边加上 -d 然后最这个构造好的二叉树进行遍历,三种遍历的顺序分别是这样的: ① 前序遍历:根-左-右 ② 中序遍历:左-

波兰、逆波兰表达式

软考习题里遇到了这样一道题,给出了一个逆波兰式,让求它对应的中缀表达式. 逆波兰式:ab-cd+* ,它的中缀表达式是(a-b)*(c+d) 思考: 这让我蒙圈了,这是为什么呢.怎么得到的呢,应该有什么规律的吧. 首先我们要知道: 波兰式:前缀表达式 逆波兰式:后缀表达式 了解这三个表达式之前,我们需要知道 表达式 解释 例子 前缀 不含括号的的算数表达式,将运算符写在前面,操作数写在后面 *+ 2 1 3 中缀 必须含括号,操作符处于操作数的中间 (2+1)*3 后缀 不含括号,运算符放在两个