zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    

      

  • 相关阅读:
    [转载]使用SecureCRT进行vim编辑的时候,小键盘变成字母的解决办法
    [转载]运行中的程序突然出现"Killed"原因
    [转载]IPv6地址表示方法详解
    【转载】深入浅出Pairwise算法
    [转载]不要用强制方法杀掉python线程
    [转载]Python SQLite3的问题sqlite3.ProgrammingError: SQLite objects created in a thread
    SQL语句中distinct的分页和查询数据数量
    SQL语句中获取时间的方法
    SQLService中使用SQL语句书写分页
    使用Angular下拉自动加载
  • 原文地址:https://www.cnblogs.com/lanying/p/5003942.html
Copyright © 2011-2022 走看看