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;
        }
    };
  • 相关阅读:
    SQL行转列问题
    pgAdmin III 单表数据的导出导入
    window 服务的安装和卸载
    将Excel表格转成DataTable
    “Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应”解决方法
    form-data提交
    由于本公司项目需要,现急需拥有微软MCSE证书的人才,一经录用,待遇从优!
    Head First设计模式悟道
    entityframwork
    .net 开源模板引擎jntemplate 教程:基础篇之在ASP.NET MVC中使用Jntemplate
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4850785.html
Copyright © 2011-2022 走看看