码迷,mamicode.com
首页 > 其他好文 > 详细

将中缀式转化为逆波兰式 (栈)

时间:2015-10-01 11:40:42      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:

逆波兰式: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;
    }
};

 

将中缀式转化为逆波兰式 (栈)

标签:

原文地址:http://www.cnblogs.com/qionglouyuyu/p/4850785.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!