1-3 表达式转换 (25分)

7-20 表达式转换 (25分)

前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。

中缀表达式就是常见的运算表达式。这个东西从小到大一直在使用,因为人们很容易接受。

后缀表达式又叫做逆波兰表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。

这篇文章写的非常好,太喜欢这种博客的写作方式了,以后我也要多加一些干货。逆波兰表达式求值
例如:
对于表达式 Exp = a * b + (c - d / e) * f
前缀表达式为: + * a b * - c / d e f
中缀表达式为: a * b + c - d / e * f
后缀表达式为: a b * c d e / - f * +

参考链接在这里

这个题,我tm写了好久啊!
好多天没有思路,我直接要崩溃了啊。

3-7 表达式转换 (20分)

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

输入格式:

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

输出格式:

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

输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +

AC【借鉴】

这里涉及到各种符号的优先级,好好记住!!!

参考博文

#include<bits/stdc++.h>
using namespace std;

int main(){
    /*ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);*/
    //加快C++输入输出的,这里不写也可以。
    string s;
    cin>>s;
    int len=0;
    //这里先查看第一个数字的长度,包括判断是不是小数
    for(int i=0;i<s.length();i++){
        if(s[i]>='0'&&s[i]<='9'||s[i]=='.')
            len++;
    }
    //如果只有一个数字的话,输出这个数字。程序结束。
    if(len==s.length()){
        cout<<s;
        return 0;
    }
    //判断第一个数字前有没有负号
    if(s[0]=='-'){
      s=s.substr(1);//取字符串下标从1直到结束的字符串
        cout<<"-";
    }
    stack<char> st;
    string res;
    for(int i=0;i<s.length();i++){
        if(s[i]>='0'&&s[i]<='9'){
            int j=i+1;
            while(s[j]>='0'&&s[j]<='9'||s[j]=='.')
                j++;//如果下一字符也是数字,接着遍历,运算数可能是多位数
            res=res+s.substr(i,j-i)+" ";
            i=j-1;//一次循环之后,i要加1,所以这里减去1
        }else{
            char op=s[i];
            if(op=='+'&&s[i-1]!='('||op=='-'&&s[i-1]!='('){
                //后面是加减号,不入栈
                while(!st.empty()&&st.top()!='('){
                    res=res+st.top()+" ";
                    st.pop();
                }
                st.push(op);//低优先级的运算符最后入栈
            }else if(op=='*'||op=='/'||op=='('){
                st.push(op);//高优先级的直接入栈
            }else if(op==')'){
                //遇到右括号,出栈,知道遇到左括号
                while(st.top()!='('){
                    res=res+st.top()+" ";
                    st.pop();
                }
                st.pop();//弹出左括号,不输出。
            }
        }
    }
    while(!st.empty()){//把栈内的元素全部弹出
        res=res+st.top();
        if(st.size()>1) res=res+" ";
        st.pop();
    }
    cout<<res;
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆烂.MVP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值