码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-04-30 22:17:40      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:   数据结构   

题目链接: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;
}


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

标签:   数据结构   

原文地址:http://blog.csdn.net/glqac/article/details/24807889

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!