数据结构实验之栈二:一般算术表达式转换成前缀式,中缀式,后缀式

 

算术表达式的转换

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 }
View Code

 

posted @ 2013-07-30 14:33  狂盗一枝梅  阅读(1640)  评论(0编辑  收藏  举报