中缀表达式转化为后缀表达式——觉得蛮好的题目着实想了半天

题目链接:click here~

中文题意思非常明了就不解释了。。思路就是用栈,要是没有括号此题灰常简单,有括号了就要好好理清思路了

1.是数字就直接进队列或者输出,此题因为是有浮点数,所以不推荐进队列,因为要是一个数字还好,可以用queue<char>来写然后用%C来输出,但是小数怎么办?我觉得也许可以队列输出的时候判断下一个char元素是+ - * / 的时候才输出空格那样就要用2个变量来保存,这样的确可以做,太烦了。

2.是加号减号的时候要不停判断栈顶元素的优先级是否大于等于它,是,输出,直到不是(其实只有左括号的时候和空的时候才不是),然后再压栈。

3.是乘除的时候也要判断,这里我就WA了2回,我觉得乘除优先级最高,就直接压栈了,其实如果栈顶元素是乘除,那得先输出它,所以还得到这些输出完了后才压栈。

4.左括号是优先级最低的,碰到就压栈。

5.右括号的话,就一直输出,直到左括号为止。

6.这道题还有一个比较烦人的地方就是空格,要是全部是整数就直接碰到数就输出数加上一个空格,碰到符号就输出符号加上一个空格,有浮点数就要在如果这个是运算符except左括号和前面一项是右括号的时候输出空格。除了前左括号很好理解,因为括号不输出,只要输出数和运算符,而为什么是前面一项括号,因为后面的输出肯定是“%c ”,后面有个空格,右括号出现的时候,不停的输出,到最后一个元素已经多了一个空格,所以就不需要输出空格了。

具体代码如下:

#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<stdlib.h>
using namespace std;

int main()
{
//    freopen("input.txt","r",stdin);
//    freopen("out.o","w",stdout);
    int n;
    scanf("%d\n",&n);
    stack<char>st;
    while(n--)
    {
        char s[1005];
        gets(s);
        int len = strlen(s);
        int i;
        for(i = 0; i < len; i++)
        {
            if(isdigit(s[i]) || s[i] == '.')
            	printf("%c",s[i]);
            else
            {
                if(s[i]!= '(' && s[i-1] != ')') printf(" ");
                if(s[i] == ')')
                {
                    while(!st.empty()&&st.top() != '(')
                    {
                        printf("%c ",st.top());
                        st.pop();
                    }
                    st.pop();//right bracket
                }
                if(s[i] == '+' || s[i] == '-')
                {
                    while(!st.empty()&&st.top()!='(')
                    {
                        printf("%c ",st.top());
                        st.pop();
                    }
                    st.push(s[i]);
                }
                if(s[i] == '*' || s[i] == '/' )
                {
                    while(!st.empty()&&st.top()!='(' && (st.top() == '*' || st.top() == '/'))
                    {
                        printf("%c ",st.top());
                        st.pop();
                    }
                    st.push(s[i]);
                }
                if(s[i] == '(') st.push(s[i]);
                if(s[i] == '=')
                {
                    while(!st.empty())
                    {
                        printf("%c ",st.top());
                        st.pop();
                    }
                }
            }
        }
        printf("=\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值