• 4690: 数据结构-表达式转换I(中缀转后缀


    描述

     

    算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间,如1+2*(3-4)。请设计程序将中缀表达式转换为后缀表达式。

    输入

     

    输入数据有多组,每组一行中给出不含空格的中缀表达式,可包含+、-、*、/以及左右括号(),表达式不超过20个字符。

    表达式中的操作数均在0~9之间,如不存在11-12这样的表达式,但允许1-2这样的表达式存在。

    输出

     

    每组输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

    样例输入

    样例输出

    思路:
    遇到数字直接进vector
    遇到)时一直出栈 直到遇到(,同时pop掉(
    遇到+-*/时 弹出所有优先级大于或者等于该运算符的栈顶元素 且该元素入栈
    其他符号入栈 也就是(
    栈中还有元素时 弹出到vector中
    最后依次输出vector里的元素
    #include<bits/stdc++.h>
    using namespace std; 
    stack<char>st;
    vector<char>v;
    int main()
    {
        string s;
        int i,l;
        while(cin>>s)
        {
            l=s.size();
            for(i=0;i<l;i++)
            {
                if(s[i]>='0'&&s[i]<='9')v.push_back(s[i]);//数字直接存vector里
                else if(s[i]==')')            //是右括号时,一直出栈直到遇到左括号 
                {
                    while(!st.empty()&&st.top()!='(')
                    {
                        char x=st.top();
                        v.push_back(x);
                        st.pop();
                    }
                    st.pop();
                }
                 else if(s[i]=='+'||s[i]=='-')////弹出所有优先级大于或者等于该运算符的栈顶元素 
                                              //因为+-已经是优先级最低的运算符 所以 一直出栈直到遇到左括号
                {
                    while(!st.empty()&&st.top()!='(')//后面那个条件不能少
                    {
                        char x=st.top();
                        v.push_back(x);
                        st.pop();
                    }
                    st.push(s[i]);//该符号入栈 
                }
                else if(s[i]=='*'||s[i]=='/')
                {
                    while(!st.empty()&&(st.top()=='*'||st.top()=='/')&&st.top()!='(')//弹出所有优先级大于或者等于该运算符的栈顶元素
                    {
                        char x=st.top();
                        v.push_back(x);
                        st.pop();
                    }
                    st.push(s[i]);//该符号入栈 
                }
                else st.push(s[i]);
            }
            while(!st.empty())//栈里还有东西时,依次出栈 
            {
                char x=st.top();
                v.push_back(x);
                st.pop();
            }
            for(i=0;i<v.size();i++)//输出vector 
            {
                if(i!=0)cout<<" ";
                cout<<v[i];
            }
            cout<<endl;
            v.clear();
        }
        return 0;
    }
    View Code
  • 相关阅读:
    HDU Ignatius and the Princess III (母函数)
    HDU 1014 Uniform Generator
    HDU 1013 Digital Roots
    HDU u Calculate e
    HDU 1005 Number Sequence 找规律
    Vijos 送给圣诞夜的极光(bfs)
    HDU Sum Problem (一道神坑的水题)
    Vijos CoVH之再破难关(搜索+hash)
    VIjos 晴天小猪历险记之Number (搜索+链表hash)
    Vijos 有根树的同构问题【字符串---最小表示法】
  • 原文地址:https://www.cnblogs.com/ydw--/p/10633141.html
Copyright © 2020-2023  润新知