中缀表达式转换成后缀表达式

中缀表达式即普通的运算式子,运算符是以中缀形式处于操作数的中间(例:3 + 4),后缀表达式就是逆波兰式(例:3 4 +),中缀表达式转后缀表达式也是学习数据结构中的栈的时候一个典型的例子,结合上一次写到逆波兰式。可以用这种原理即输入普通式子(即中缀表达式),转换成后缀表达式,然后通过后缀表达式(逆波兰式)的计算,可以得出结果。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define STACK_INIT_SIZE 20
  4 #define STACK_INCREMENT 10
  5 typedef char ElemType;
  6 typedef char Status;
  7
  8 typedef struct
  9 {
 10     ElemType *base;
 11     ElemType *top;
 12     int stacksize;
 13 }SqStack;
 14
 15 Status InitStack( SqStack *S )
 16 {
 17     S->base = ( ElemType *) malloc (  STACK_INIT_SIZE*sizeof( ElemType ) );
 18     S->top  = S->base ;
 19     S->stacksize = STACK_INIT_SIZE;
 20
 21     return 0;
 22 }
 23
 24 //插入元素e,即入栈
 25 Status Push( SqStack *S , ElemType e )
 26 {
 27     if ( S->top - S->base >= S->stacksize )  //当前容量大于或等于最大容量
 28     {
 29     //追加栈的空间
 30     S->base = ( ElemType *) realloc ( S->base,  S->stacksize + STACK_INCREMENT*sizeof( ElemType ) );
 31     if ( !S->base )
 32         return  -1;
 33     S->top = S->base  + S->stacksize ;
 34     S->stacksize = S->stacksize + STACK_INCREMENT;
 35
 36     }
 37     //开始赋值
 38     *S->top = e;
 39     S->top++;
 40
 41     return 0;                              //注意返回值为0,不是e
 42 }
 43
 44 //弹出元素e,即出栈
 45 Status Pop ( SqStack *S , ElemType *e )//此处S为结构体指针的变量,所以访问结构体成员用"->"
 46 {
 47     //首先判断栈内是否为空
 48     if ( S->top == S->base )
 49     return -1 ;
 50
 51     --S->top ;
 52     *e = *S->top ;
 53
 54     return *e;                         //注意返回值为e,不是0
 55 }
 56
 57 int StackLen ( SqStack S )//S为结构体变量,所以访问结构体成员用"."
 58 {
 59     return  ( S.top - S.base );
 60 }
 61
 62 int main()
 63 {
 64    SqStack s;
 65    char c,e;
 66    InitStack(&s);
 67    printf("请按中缀表达式输入式子,以‘#‘作为结束符:\n");
 68    scanf("%c",&c);
 69    while(c!=‘#‘)
 70    {
 71        while(c>=‘0‘&&c<=‘9‘)
 72        {
 73            printf("%c",c);
 74            scanf("%c",&c);
 75            if(c<‘0‘||c>‘9‘)
 76            {
 77                printf(" ");
 78            }
 79        }
 80            if(‘)‘==c)
 81            {
 82                 Pop(&s,&e);
 83                 while(‘(‘!=e)
 84                 {
 85                     printf("%c ",e);
 86                     Pop(&s,&e);
 87                 }
 88            }
 89            else if(‘+‘==c||‘-‘==c)
 90            {
 91                if(!StackLen(s))
 92                {
 93                    Push(&s,c);
 94                }
 95                else
 96                {
 97                    do
 98                    {
 99                        Pop(&s,&e);
100                        if(‘(‘==e)
101                        {
102                            Push(&s,e);
103                        }
104                        else
105                        {
106                            printf("%c ",e);
107                        }
108                    }while(StackLen(s)&&‘(‘!=e);
109                    Push(&s,c);
110                }
111            }
112
113            else if(‘*‘==c||‘/‘==c||‘(‘==c)
114            {
115                 Push(&s,c);
116            }
117            else if(‘#‘==c)
118            {
119                break;
120            }
121            else
122            {
123                printf("\n 出错");
124                return -1;
125            }
126            scanf("%c",&c);
127    }
128        while(StackLen(s))
129        {
130            Pop(&s,&e);
131            printf("%c ",e);
132        }
133    return 0;
134 }

上面程序中几个注意点:一是出现iif(‘)‘==c)的表达式,将‘)‘写在了‘==‘的左边,这有助于调试发现错误,防止有些程序员将‘==‘打成‘=‘;不然的话即使打成c=‘)‘编译器也不会发现错误,认为是赋值,而‘)‘=c这样的式子式错误的,因为无法将变量赋值给常数;二是入栈函数(Push)和出栈函数(Pop)作为子函数式写有关栈的程序的必备子程序,可以将他们制作成头文件,以后可以直接调用。三是编程的格式,因为while().if(),

else if()这样的语句太多,还有"{}"也很多,格式整齐了就不易出错并且便于调试发现错误。

运算结果中有空格,这也是需要在程序中改进的。

时间: 2024-10-14 06:33:09

中缀表达式转换成后缀表达式的相关文章

中缀表达式转换成后缀表达式并求值

算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出. 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 6.最终将栈中的元素依次出栈,输出. 例如 a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出: 后缀表达式:a 堆栈:空 遇到

将中缀表达式转换成后缀表达式

中缀表达式(标准形式):A+(B-C/D+E)*F 后缀表达式(便于计算机计算):ABCD/-E+F*+ 本文使用栈来实现中缀表达式到后缀表达式的转换. 操作数:A B C D E F 操作符:+ - / * ( ) 操作符优先级:( )  >  / *  >  + - 逐个字符读取中缀表达式,结果不断输出,利用栈对操作符进行缓存: 1. 遇到操作数直接输出 2. 遇到操作符,如果此操作符优先级大于栈顶操作符,则将此操作符压栈,否则输出栈顶操作符:如遇到),则把栈内操作符依次弹出,直到(,()

表达式树—中缀表达式转换成后缀表达式(一)

算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出.5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈6.最终将栈中的元素依次出栈,输出.例如a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出:后缀表达式:a堆栈:空 遇到+:堆栈:空,所以+

3-6 中缀表达式转换成后缀表达式

1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\xtgmath.h(214): warning C4602: #pragma pop_macro:"new"该标识符前面没有 #pragma push_macro1>e:\极速考拉下载目录\vs2013(visual studio 2013旗舰版)\vc\include\xtgmath.h(215): warning C4193: #pragma warning(p

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

八、通过中缀计算表达式转换成后缀计算表达式

前言:中缀表达式符合人们的阅读习惯:  如:5+3 后缀表达式符合计算机的运算习惯:如:53+ 现在通过栈对运算符号的入栈.出栈操作实现将中缀表达式转化成后缀表达式 1.LinkList.h #ifndef _LINKLIST_H_ #define _LINKLIST_H_ typedef void LinkList; typedef struct _tag_LinkListNode LinkListNode; struct _tag_LinkListNode { LinkListNode* n

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

数据结构实验之栈二:一般算术表达式转换成后缀式 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. 输入 输入一个算术表达式,以'#'字符作为结束标志. 输出 输出该表达式转换所得到的后缀式. 示例输入 a*b+(c-d/e)*f# 示例输出 ab*cde/-f*+ 提示 来源 示例程序 由一般是求后缀式: 1.设立暂时存放运算符的栈: 2.设表达式的结束符为"#

数据结构实验之栈与队列二:一般算术表达式转换成后缀式

数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Description 对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之. Input 输入一个算术表达式,以‘#’字符作为结束标志. Output 输出该表达式转换所得到的后缀式. Sample Input a*b+(c-d/e)*f# Output ab*cde/-f*+ #include <stdio.h> #include <stdlib.h> char s[100005]; //分配栈的大小 int m

中缀表达式转换成前缀表达式和后缀表达式

35,15,+,80,70,-,*,20,/                   //后缀表达方式 (((35+15)*(80-70))/20)=25           //中缀表达方式 /,*,+,35,15,-,80,70, 20                 //前缀表达方式 人的思维方式很容易固定~~!正如习惯拉10进制.就对2,3,4,8,16等进制不知所措一样~~! 人们习惯的运算方式是中缀表达式.而碰到前缀,后缀方式..迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式)我