转载https://www.cnblogs.com/yelan/archive/2013/01/23/2873432.html
目的 学会引用调用
数据结构实验之栈与队列二:一般算术表达式转换成后缀式
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
#include<stdio.h>
int swi(char c))//把输入的运算符转换成数字来比较优先级
{
if(c=='+'||c=='-') return 1 ;
if(c=='*'||c=='/') return 2 ;
if(c=='(') return 3 ;
if(c==')') return 4 ;
return 0 ;
}
int main()
{
int top = 0 ;
char c=0, stack[100] ;
while(scanf("%c", &c), c!='#')
{
if(c>='a'&&c<='z')//判断字符是不是运算符 不是就输出
{
printf("%c", c) ;
}
else
{
if(top==0)//判断b栈是不是为空 是就直接入栈
{
top++ ;//栈顶向上移一位
stack[top] = c ;//增加一个成员
}
else
if(swi(c)>=swi(stack[top]))]))//如果是运算符 而且输入的比栈顶运算符优先级高
{
if(swi(c)==4))//如果是')'就把'('之前的运算符全部输出
{
while(stack[top]!='(')
{
printf("%c",stack[top--]) ;
}
top-- ;
}
else
{
top++ ;//如果不是 就入栈
stack[top] = c ;
}
}
else//如果优先级比它低
{
if(stack[top]!='(')//如果不是'(' 就把它(优先级高)出栈
{
printf("%c", stack[top]) ;
stack[top] = c ;
}
else
{
top++ ;
stack[top] = c ;//如果是'(' 就直接入栈
}
}
}
}
while(top!=0)//判断栈是否为空 不为空就全部出栈
{
printf("%c", stack[top]) ;
top-- ;
}
printf("\n") ;
return 0 ;
}
1 /* 将中缀表达式(a+b)转换为后缀表达式(ab+)的算法思想:
2 ·当读到数字直接送至输出队列中
3 ·当读到运算符t时,
4 a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;
5 b.t进栈
6 ·读到左括号时总是将它压入栈中
7 ·读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号。
8
9 运用后缀表达式进行计算的具体做法:
10 ·建立一个栈S
11 ·从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符 Y”的形式计算机出结果,再压加栈S中
12 ·如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束 */