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