题目描述
Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample
Input
a*b+(c-d/e)*f#
Output
abcde/-f+
转换规定
从左到右遍历中缀表达式的每个符号和字母(数字),若是字母(数字)就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
总结
+
-
)
进栈时,栈中元素弹出直到遇到(
停止弹出。
但有两点需要注意:
+
-
需要进栈且(
不出栈 。
)
不进栈且(
出栈。
*
/
进栈只弹*
/
。
代码如下
#include<iostream>
#include<stack>
using namespace std;
const int N = 1e2 + 10;
char c[N], ch[N], s[N]; //s[N] 栈
int cnt, top;
void stackway()
{
cnt = 0;
for (int i = 0; ch[i] != '#'; i++)
{
if (ch[i] >= 'a' && ch[i] <= 'z')
{
c[cnt++] = ch[i];
continue;
}
else
{
if (ch[i] == '+' || ch[i] == '-' || ch[i] == ')') // + - ) 进栈
{
while (top)
{
char j = s[top--];
if (j == '(') // 遇到 (停止弹出
{
top++;
break;
}
c[cnt++] = j;
}
if (ch[i] == ')') top--; // )不进栈
else
s[++top] = ch[i];
continue;
}
else
{
if (ch[i] == '*' || ch[i] == '/') // * / 进栈
{
while (1)
{
if (s[top] == '*' || s[top] == '/') // 只弹 * /
{
c[cnt++] = s[top--];
}
else
{
break;
}
}
}
s[++top] = ch[i];
continue;
}
}
}
while (top) //栈中剩余元素输出
{
c[cnt++] = s[top--];
}
}
int main()
{
while (1)
{
cin >> ch[cnt++];
if (ch[cnt - 1] == '#') break;
}
stackway();
for (int i = 0; i < cnt; i++)
cout << c[i];
cout << endl;
}