中序表达式转换成后序表达式问题(栈的应用)


/*
中序表达转换成后序表达式的方法:

从左到右读取该中弱序表达式:

1.若是操作数,则直接输出.

2.若是运算符:
(1)若该运算符为"(",则直接入栈.
(2)若该运算符为")",则取出堆栈中的运算符,直到"("时.
(3)其它: 按优先级比较,如果大于或等于堆栈中当前的运算则压入栈中,否则直接输出.
(4)检查栈是否非空,如果非空,则输出所有值,直到空为止.

*/


#include 
< stdio.h >
#include 
< stdlib.h >
#include 
< string .h >
#include 
< ctype.h >

#define  MAX 101 /*表达式的最大长度*/

typedef 
struct  optor
{
        
char ch ;
        
struct optor *next ;
}
OPT ;

/*typedef struct data
{
        int num ;
        struct data *next ;
}DAT ;
*/

   OPT 
* opttop  =  NULL ;  /*初始堆栈*/
 
/*  DAT *dattop = NULL ;*/

void  push_opt(  int  cx)
{
     OPT 
*q ;
     q 
= (OPT *)malloc(sizeof(OPT)) ;
     q
->ch = cx ;
     q
->next= opttop;
     opttop 
= q ;
}




char  top_opt( void )
{
     
if(opttop)
     
return opttop->ch ;
     
return '#' ;
}




void  pop_opt()
{
     OPT 
*q ;
     q 
= opttop ;
     opttop 
= opttop->next ;
     free(q);

}



int  rank( char  cr)
{
    
if( cr == '-' || cr == '+')
    
return 1 ;
    
else if( cr == '*' || cr == '/')
    
return 2 ;
    
else if( cr == '^')
    
return 3 ;
}



     
int  main( void )
{
    
char st[MAX]={'
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您解答。以下是将中序表达式换为后序表达式的堆方式图解: 1. 创建一个空和一个空的输出队列。 2. 从左到右扫描中序表达式。 3. 如果扫描的元素是一个操作数,将其添加到输出队列的末尾。 4. 如果扫描的元素是一个左括号,将其压入中。 5. 如果扫描的元素是一个右括号,则将中的元素弹出并添加到输出队列,直到遇到左括号。左括号不会被添加到输出队列中,也不会被弹出。 6. 如果扫描的元素是一个运算符,首先将其与顶元素进行比较。 1. 如果顶元素的优先级比该运算符的优先级高或相等,则将顶元素弹出并添加到输出队列中,直到顶元素的优先级低于该运算符。 2. 将该运算符压入中。 7. 当扫描完成后,将中剩余的元素弹出并添加到输出队列中。 8. 输出队列中的元素即为后序表达式。 下面是一个具体的例子: 假设要将中序表达式 "5 + ((1 + 2) * 4) - 3" 换为后序表达式。 1. 创建一个空和一个空的输出队列。 2. 从左到右扫描中序表达式。 - 5:操作数,添加到输出队列中。 - +:运算符,压入中。 - (:左括号,压入中。 - (:左括号,压入中。 - 1:操作数,添加到输出队列中。 - +:运算符,压入中。 - 2:操作数,添加到输出队列中。 - ):右括号,将中的元素弹出并添加到输出队列中,直到遇到左括号。输出队列变为 "1 2 + "。 - *:运算符,顶运算符的优先级高于该运算符,将顶元素弹出并添加到输出队列中。输出队列变为 "1 2 + ". - 4:操作数,添加到输出队列中。输出队列变为 "1 2 + 4 ". - ):右括号,将中的元素弹出并添加到输出队列中,直到遇到左括号。输出队列变为 "1 2 + 4 * ". - -:运算符,顶运算符的优先级低于该运算符,将该运算符压入中。 - 3:操作数,添加到输出队列中。输出队列变为 "1 2 + 4 * 3 ". 3. 当扫描完成后,将中剩余的元素弹出并添加到输出队列中。顶元素为减号,弹出并添加到输出队列中。输出队列变为 "1 2 + 4 * 3 - "。 4. 输出队列中的元素即为后序表达式,为 "1 2 + 4 * 3 -"。 希望这个图解能够解决您的问题。如果您还有其他问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值