数据结构实验之栈二:一般算术表达式转换成后缀式
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
View Code
1 #include<stdio.h> 2 int swi(char c))//把输入的运算符转换成数字来比较优先级 3 { 4 if(c=='+'||c=='-') return 1 ; 5 if(c=='*'||c=='/') return 2 ; 6 if(c=='(') return 3 ; 7 if(c==')') return 4 ; 8 return 0 ; 9 } 10 int main() 11 { 12 int top = 0 ; 13 char c=0, stack[100] ; 14 while(scanf("%c", &c), c!='#') 15 { 16 if(c>='a'&&c<='z')//判断字符是不是运算符 不是就输出 17 { 18 printf("%c", c) ; 19 } 20 else 21 { 22 if(top==0)//判断b栈是不是为空 是就直接入栈 23 { 24 top++ ;//栈顶向上移一位 25 stack[top] = c ;//增加一个成员 26 } 27 else 28 if(swi(c)>=swi(stack[top]))]))//如果是运算符 而且输入的比栈顶运算符优先级高 29 { 30 if(swi(c)==4))//如果是')'就把'('之前的运算符全部输出 31 { 32 while(stack[top]!='(') 33 { 34 printf("%c",stack[top--]) ; 35 } 36 top-- ; 37 } 38 else 39 { 40 top++ ;//如果不是 就入栈 41 stack[top] = c ; 42 } 43 } 44 else//如果优先级比它低 45 { 46 if(stack[top]!='(')//如果不是'(' 就把它(优先级高)出栈 47 { 48 printf("%c", stack[top]) ; 49 stack[top] = c ; 50 } 51 else 52 { 53 top++ ; 54 stack[top] = c ;//如果是'(' 就直接入栈 55 } 56 } 57 } 58 } 59 while(top!=0)//判断栈是否为空 不为空就全部出栈 60 { 61 printf("%c", stack[top]) ; 62 top-- ; 63 } 64 printf("\n") ; 65 return 0 ; 66 }
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 ·如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束 */