数据结构实验之栈二:一般算术表达式转换成前缀式,中缀式,后缀式
算术表达式的转换
Time Limit: 1000MS Memory limit: 65536K
题目描述
小明在学习了数据结构之后,突然想起了以前没有解决的算术表达式转化成后缀式的问题,今天他想解决一下。
因为有了数据结构的基础小明很快就解出了这个问题,但是他突然想到怎么求出算术表达式的前缀式和中缀式呢?小明很困惑。聪明的你帮他解决吧。
输入
输入一算术表达式,以\'#\'字符作为结束标志。(数据保证无空格,只有一组输入)
输出
输出该表达式转换所得到的前缀式 中缀式 后缀式。分三行输出,顺序是前缀式 中缀式 后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
+*ab*-c/def a*b+c-d/e*f ab*cde/-f*+
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 char g[200];
5 int top=-1;
6 int cmp(char ch)//比较优先级
7 {
8 if(ch=='+'||ch=='-')return 1;
9 if(ch=='*'||ch=='/')return 2;
10 if(ch=='(')return 3;
11 }
12 void ruzhan(char ch)//入栈操作
13 {
14 top++;
15 g[top]=ch;
16 }
17 void houzhui(char f[])//将中缀式转换成后缀式的函数
18 {
19 int i;
20 for(i=0;f[i]!='#';i++)
21 {
22 if((f[i]>='0'&&f[i]<='9')||(f[i]>='a'&&f[i]<='z'))//如果是字母或者是数字,就直接输出
23 printf("%c",f[i]);
24 else //如果是运算符的话
25 {
26 if(f[i]=='(')ruzhan('(');//如果是左括号直接入栈
27 else if(f[i]==')')//如果是右括号的话,将左括号以前的出栈并且删除括号
28 {
29 for(;g[top]!='(';top--)
30 printf("%c",g[top]);
31 top--;
32 }
33 else //如果是其他运算符,这里特指加减乘除运算
34 {
35 if(cmp(g[top])>=cmp(f[i]))//如果栈顶元素大于等于当前元素
36 {
37 if(g[top]=='(')ruzhan(f[i]);//栈顶元素是左括号的情况,当前元素直接进栈
38 else//当前元素不是左括号
39 {
40 printf("%c",g[top]);//输出栈顶元素
41 g[top]=f[i];//用当前元素覆盖栈顶元素
42 }
43 }
44 else//如果栈顶元素小于当前元素
45 {
46 ruzhan(f[i]);//当前元素直接进栈
47 }
48 }
49 }
50 }
51 //栈中剩余元素全部输出
52 for(;top>=0;top--)
53 printf("%c",g[top]);
54 top=-1;
55 printf("\n");
56 }
57 void qianzhui(char f[])//将中缀式转换成前缀式的函数
58 {
59 char fj[200];
60 int flag=0;
61 int t=strlen(f);
62 int i,j;
63 char gh[200];
64 for(i=t-2,j=0;i>=0;i--,j++)
65 gh[j]=f[i];
66 gh[j]='#';
67 for(i=0;gh[i]!='#';i++)
68 {
69 if((gh[i]>='0'&&gh[i]<='9')||(gh[i]>='a'&&gh[i]<='z'))//如果是字母或者是数字,就直接输出
70 {
71 fj[flag]=gh[i];
72 flag++;
73 }
74 else //如果是运算符的话
75 {
76 if(gh[i]==')')ruzhan(')');//如果是右括号直接入栈
77 else if(gh[i]=='(')//如果是左括号的话,将右括号以前的出栈并且删除括号
78 {
79 for(;g[top]!=')';top--)
80 {
81 fj[flag]=g[top];
82 flag++;
83 }
84 top--;
85 }
86 else //如果是其他运算符,这里特指加减乘除运算
87 {
88
89 if(cmp(g[top])>cmp(gh[i]))//如果栈顶元素大于等于当前元素,这里的if后面的大于号“>”是很重要的区分(和后缀式的代码相比较)
90 {
91 if(g[top]==')')ruzhan(gh[i]);//栈顶元素是右括号的情况,当前元素直接进栈
92 else//当前元素不是右括号
93 {
94 {
95 fj[flag]=g[top];
96 flag++;
97 }//输出栈顶元素
98 g[top]=gh[i];//用当前元素覆盖栈顶元素
99 }
100 }
101 else//如果栈顶元素小于当前元素
102 {
103 ruzhan(gh[i]);//当前元素直接进栈
104 }
105 }
106 }
107 }
108 //栈中剩余元素全部输出
109 for(i=0;top>=0;top--,i++)
110 {
111 fj[flag]=g[top];
112 flag++;
113 }
114 for(i=flag-1;i>=0;i--)
115 printf("%c",fj[i]);
116 printf("\n");
117 }
118 void zhongzhui(char f[])//将中缀式转换成中缀式的函数(去括号)
119 {
120 int i;
121 for(i=0;f[i]!='#';i++)
122 {
123 if(f[i]!='('&&f[i]!=')')
124 printf("%c",f[i]);
125 }
126 printf("\n");
127 }
128 int main()
129 {
130 char f[200];
131 scanf("%s",f);
132 qianzhui(f);
133 zhongzhui(f);
134 houzhui(f);
135 return 0;
136 }