zoukankan      html  css  js  c++  java
  • 将中缀式转化为逆波兰式 (栈)

    逆波兰式:Reverse Polish notation,RPN,,也叫后缀表达式,将运算符写在操作数之后

    数据结构:两个栈S1和S2。S1临时存储运算符,S2存储最终结果。

    算法:
    (1)若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈
    (2)若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否则,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入S1栈。
    (3)若取出的字符是“(”,则直接送入S1栈栈顶。
    (4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”。
    (5)重复上面的1~4步,直至处理完所有的输入字符
    (6)最后将S1栈内所有运算符,逐个出栈,依次送入S2栈。

    class Solution {
    public:
        string ReversePolishNotation(string exp) { //假设操作数都是单个数字
            map< char, int > opPriority;
            opPriority['+'] = 1;
            opPriority['-'] = 1;
            opPriority['*'] = 2;
            opPriority['/'] = 2;
            opPriority['('] = 0;
            stack rpnStack;
            stack tmpStack;
            for(int i = 0; i < exp.size(); i++){
                if(exp[i] <= '9' && exp[i] >= '0') rpnStack.push(exp[i]);
                else if(exp[i]==')'){
                    while(tmpStack.top()!='('){
                        rpnStack.push(tmpStack.top());
                        tmpStack.pop();
                    }
                    tmpStack.pop();
                }
                else if(exp[i]=='(' || tmpStack.empty()) tmpStack.push(exp[i]);
                else{
                    while(!tmpStack.empty() && opPriority[tmpStack.top()] > opPriority[exp[i]]) {
                        rpnStack.push(tmpStack.top());
                        tmpStack.pop();
                    }
                    tmpStack.push(exp[i]);
                }
            }
            while(!tmpStack.empty() ){
                rpnStack.push(tmpStack.top());
                tmpStack.pop();
            }
            string ret = "";
            while(!rpnStack.empty() ){
                ret = rpnStack.top() + ret;
                rpnStack.pop();
            }
            return ret;
        }
    };
  • 相关阅读:
    解决Chrome关联HTML文件,图标不显示的问题。
    Tomcat启动超时问题Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    matlalb 的后台运行方式
    新转移注意(caffe):ImportError: libcudart.so.7.0: cannot open shared object file: No such file or directory
    查看nvidia显卡命令
    train validation test
    lmdb数据格式
    github
    2016 hosts
    opencv3.0 imread问题
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4850785.html
Copyright © 2011-2022 走看看