Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
ab*cde/-f*+
思路:(一)、'('这个单独判断。不管栈是不是空栈,也就是说没有限制条件,都直接入栈。
(二)、如果上来就是空栈,那么所有的运算符'+'、'-'、'*'、'/'.都可以入栈。
(三)、如何不是空栈,又遇到运算符,那么就一直出栈,直到遇到比自己优先级低的、或者遇到'(',再或
者栈内元素全部出栈时,停止出栈,再将该运算符入栈。
(四)、如果是其他的非运算符,直接输出即可。
(五)、如果遇到')',就一直出栈,直到栈顶元素为'('为止,并且将'('直接抛弃掉。
(六)、最后一定不要忘记把栈内的元素全部输出出来。一个while循环就行。
AC代码:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
int main()
{
stack<char>st;
char ch;
while(scanf("%c",&ch)&&ch!='#')
{
if((ch=='+'||ch=='-'||ch=='*'||ch=='/')&&st.empty())
st.push(ch);
else if(ch=='(')
st.push(ch);
else if((ch=='+'||ch=='-')&&!st.empty())
{
while(!st.empty()&&st.top()!='(')
{
printf("%c",st.top());
st.pop();
}
st.push(ch);
}
else if((ch=='*'||ch=='/')&&!st.empty())
{
while(!st.empty()&&st.top()!='('&&st.top()!='+'&&st.top()!='-')
{
printf("%c",st.top());
st.pop();
}
st.push(ch);
}
else if(ch==')')
{
while(st.top()!='(')
{
printf("%c",st.top());
st.pop();
}
st.pop();
}
else
{
printf("%c",ch);
}
}
while(!st.empty())
{
printf("%c",st.top());
st.pop();
}
printf("\n");
return 0;
}
今天重新刷了一遍有错了!!在这里在强调一下,当栈内的操作符号大于等于要入栈的操作符的时候都要出栈,我当时没有考虑到相等的情况,但是样例过了,一直找不到错误,不得已重新看了自己以前写的这份答案。