zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    spark map和mapPartitions的区别
    RDD实例
    Scala类和对象
    Scala的集合框架
    Scala的to和until
    用不同RequestMethod制作出restful规范的应用
    isc-dhcp-server的分配的地址列表在哪,linux/树莓派做无线路由器怎么查看已连接设备
    在java中实现通过身份证号码判断籍贯的小工具类
    解决eclipse写jsp javaee时自动代码提示弹出过慢的问题
    第一篇博兼测试博之稍稍修改一下博客主题
  • 原文地址:https://www.cnblogs.com/ydw--/p/10633141.html
Copyright © 2011-2022 走看看