Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Example Input
a*b+(c-d/e)*f#
Example Output
ab*cde/-f*+
算法描述:
准备两个栈,一个存运算符的op栈,一个存后缀表达式的postexp栈while(从中缀表达式读取字符ch&&ch!=’\0’){
ch位数字:将其存放到postexp中;
ch为左括号’(‘:将其进栈到op中;
ch为右括号’)’:将op中的所有运算符出栈并存放到postexp中,直到遇到左括号’(‘,并将其出栈
ch为’+’或’-‘:出栈运算符并存放到postexp中,直到栈空或者栈顶元素为’(‘,然后将ch进栈;
ch为’*’或’/’:出栈运算符并存放到postexp中,直到栈空或者栈顶元素为’(‘、’+’或’-‘,然后将ch进栈;
}
若中缀表达式扫描完毕,则将op中所有的运算符一次出栈并存放到postexp中
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
int main()
{
char a[1005];
char b[1005];
scanf("%s",a);
stack<char>op;
stack<char>postexp;
for(int i=0;a[i]!='#';i++)
{
switch(a[i])
{
case '(':
op.push(a[i]);
break;
case '-':
case '+':
while(!op.empty())
{
if(op.top() == '(')
break;
postexp.push(op.top());
op.pop();
}
op.push(a[i]);
break;
case '*':
case '/':
while(!op.empty())
{
if(op.top() == '(' || op.top() == '+' || op.top() == '-')
break;
postexp.push(op.top());
op.pop();
}
op.push(a[i]);
break;
case ')':
while(!op.empty())
{
if(op.top() == '(')
{
op.pop();
break;
}
postexp.push(op.top());
op.pop();
}
break;
default:
postexp.push(a[i]);
}
}
while(!op.empty())
{
postexp.push(op.top());
op.pop();
}
int k=0;
while(!postexp.empty())
{
b[k++] = postexp.top();
postexp.pop();
}
for(int i=k-1;i>=0;i--)
printf("%c",b[i]);
printf("\n");
return 0;
}