中序转为前序与后序

一.中序—>前序

1.步骤:

(1)从右到左读进中序表达式的每个字符

(2)如果读进的字符为操作数,则直接输出到前序表达式中

(3)如果遇到“(”,则弹出堆栈内的运算符,直到弹出一个“)”,两者相互抵消

(4)“)”的优先级在堆栈内比任何运算符都小,不过在堆栈外却是优先级最高者

(5)当运算符准备进入堆栈内时,必须和栈顶运算符比较,如果外面的运算符优先级高于或等于栈顶运算符,则压入栈中

如果优先级低于栈顶运算符,就把栈顶运算符弹出,直到栈顶运算符优先级低于外面运算符或堆栈为空,就再把外面这个运算符压入栈中

(6)中序表达式读完后,如果运算符堆栈不为空,则将期内的运算符逐一弹出,输出到前序表达式中即可。

例:(A+B)*D+E/(F+A*D)+C

用堆栈法转换为前序表达式步骤

读入字符

运算符堆栈中内容 输出
None Empty None
C Empty C
+ + C
) )+ C
D )+ DC
* *)+ DC
A *)+ ADC
+ +)+ *ADC
F +)+ F*ADC
( + +F*ADC
/ /+ +F*ADC
E /+ E+F*ADC
+ ++ /E+F*ADC
D ++ D/E+F*ADC
* *++ D/E+F*ADC
) )*++ D/E+F*ADC
B )*++ BD/E+F*ADC
+ +)*++ BD/E+F*ADC
A +)*++ ABD/E+F*ADC
( *++ +ABD/E+F*ADC
None Empty ++*+ABD/E+F*ADC

2.编码实现

二、中序—>后序

1.步骤

(1)从左到右读入中序表达式每个字符

(2)如果读进的字符为操作数,则直接输出到后序表达式中

(3)如果遇到“)”,则弹出堆栈内的运算符,直到弹出到一个“(”两者互相抵消

(4)“(”的优先级在堆栈内比任何运算符都小在堆栈外却是优先级最高者

(5)当运算符进栈时,如果外面的运算符高于栈顶运算符,则压入栈中

如果优先级低于或等于栈顶运算符就把栈顶运算符弹出,直到栈顶运算符优先级低于外面运算符或堆栈为空,就把外面运算符压入栈中

(6)中序表达式读完后,如果运算符堆栈不为空·,则将期内的运算符逐一弹出。

 

代码展示(中序->后序):

#include 
#include 
#define MAX 50
char infix_q[MAX]; 
int compare(char stack_o, char infix_o); 
void infix_to_postfix();    
/*运算符优先权的比较,若输入运算符小于堆栈中的运算符*/
/*,则返回值为1,否则为0                          */

/*主函数声明*/
int main () 		
{ 
    int i=0;
    for (i=0; i= (int)(index_i/2) ? 1 : 0);
}
void infix_to_postfix()
{
	int rear=0, top=0, flag=0,i=0;
	char stack_t[MAX];  
	for (i=0; i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(算法竞赛入门经典)