后缀表达式 NYOJ 257

来源:互联网 发布:淘宝网会员注册流程 编辑:程序博客网 时间:2024/05/22 09:38

转自http://www.cnblogs.com/xiaofanke/archive/2013/05/29/3106391.html


中缀表达式 转 后缀表达式

一个算术表达式,含有数字(为简化处理,数字只有一位),运算符:+-*,以及括号,求表达式的值。

 给出的表达式是一般我们见到的中缀表达式,即运算符位于操作数之间。如果把中缀表达式转化为后缀表达式,那么对后缀表达式求值将会很方便。

 后缀表达式特点

  1.操作符位于操作数之后;

  2.没有括号;

  3.运算符没有优先级。

 中缀表达式转化为后缀表达式的步骤

  1.初始化一个空操作符栈和空结果字符串;

  2.从前到后读取中缀表达式的字符,如果是操作数,加到结果字符串后面;

  3.如果是操作符,分两种情况入栈:

    a.如果待入栈操作符优先级大于栈顶操作符,直接入栈;

    b.如果待入栈操作符优先级小于或等于栈顶操作符,栈顶操作符加到结果字符串后面;重复b过程直到遇到前括号‘(’或栈顶操作符优先级比待入栈操作符小,待入栈操作符入栈。

  4.如果是前括号‘(’,直接入栈;

  5.如果是后括号,将栈中操作符依次弹出,直至遇到一个前括号‘(’结束。前括号出栈。

  最后结果字符串就是后缀表达式。

  后缀表达式求值的步骤

  1.初始化一个空操作数栈;

  2.从前到后读取后缀表达式字符。如果是操作数直接入栈。如果读到一个操作符@,弹出栈顶元素a和新的栈顶元素b,执行b @ a,将结果压入栈中;

  3.最后栈中只剩下一个元素,即表达式的值。


int cal(char c){    switch(c)    {        case '+': case '-': return 1;        case '*': case '/': return 2;        default: return -123456;    }}int main(){    int T;    string s1, ans;    stack<char> st;    cin >> T;    while(T--)    {        cin >> s1;        ans = "";        while(!st.empty()) st.pop();        st.push('#');        int l = s1.length();        for(int i = 0; i < l; i++)        {            char c = s1[i];            if(isdigit(c)) ans += c;            else if(c == '(') st.push(c);            else if(c == ')')            {                while(st.top() != '(') {ans += st.top(); st.pop();}                st.pop();            }            else            {                while( cal(c) <= cal(st.top()))                {                    ans += st.top();                    st.pop();                }                st.push(c);            }        }        while(st.top() != '#') {ans += st.top(); st.pop();}        cout << ans << endl;    }    return 0;}



0 0
原创粉丝点击