数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
Input
输入一个算术表达式,以‘#’字符作为结束标志。
Output
输出该表达式转换所得到的后缀式。
Sample Input
a*b+(c-d/e)*f#
Sample Output
ab*cde/-f*+
Hint
Source
输入字符 - > 如果字符为小写字母,输出 - > 如果字符为运算符号,判断优先级,如果 当前运算符号优先级大于栈顶优先级 则压栈, 否则输出栈顶直至top= 0或者栈顶优先级小于当前运算符号(当栈顶为‘(’时当前运算符号直接压栈) - > 如果当前字符为‘)’时 则输出栈顶 直到栈顶为‘(’ -> 如果栈中还存有字符 那么输出。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
char s[100005];
int main()
{
char st;
int top = 0;
while(scanf("%c", &st))
{
if(st == '#')
break;
else if(st >= 'a' && st <= 'z')
printf("%c", st);
else if(st == '(')
s[++top] = st;
else if(st == '+' || st == '-')
{
while(1)
{
if(top == 0 || s[top] == '(')
{
s[++top] = st;
break;
}
printf("%c", s[top]);
top--;
}
}
else if(st == '*' || st == '/')
{
while(1)
{
if(top == 0 || s[top] == '+' || s[top] == '-' || s[top] == '(')
{
s[++top] = st;
break;
}
printf("%c", s[top--]);
}
}
else if(st == ')')
{
for(;s[top] != '('; top--)
{
printf("%c", s[top]);
}
top--;
}
}
for(; top > 0; top--)
printf("%c", s[top]);
return 0;
}