Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
abcde/-f+
Hint
Source
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char data[50];
int top;
} seqstack;
void init_stack(seqstack *st) // 初始化栈
{
st->top = -1;
}
void push(seqstack *st, char num) // 压栈
{
st->top++;
st->data[st->top] = num;
}
char pop(seqstack *st) // 出栈
{
char a = st->data[st->top];
st->top--;
return a;
}
char get_top(seqstack *st) // 获取栈顶元素
{
return st->data[st->top];
}
int priority(char ch) // 判断符号优先级
{
int ret = 0;
switch(ch)
{
case '+':
case '-':
ret = 1;
break;
case '*':
case '/':
ret = 2;
break;
}
return ret;
}
int main()
{
seqstack st;
init_stack(&st);
char ch;
ch = getchar();
while(ch != '#')
{
if (ch >= 'a'&&ch <= 'z') // 若为字母,直接输出
{
printf("%c", ch);
}
else if (ch == '(') // 若为左括号,直接进栈
{
push(&st, ch);
}
else if (ch == ')') // 若为右括号,一直出栈并输出,直到找到左括号
{
while(get_top(&st) != '(')
{
printf("%c", pop(&st));
}
pop(&st); // 左括号单独出栈,不是输出
}
else // 若为运算符,小于或等于不能压,一直弹出并输出
{
while(st.top != -1&&priority(ch) <= priority(get_top(&st)))
{
printf("%c", pop(&st));
}
push(&st, ch);
}
ch = getchar();
}
while(st.top != -1) // 最后栈不为空,则弹空
{
printf("%c", pop(&st));
}
return 0;
}