欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

栈实现中缀表达式转后缀表达式

程序员文章站 2022-06-03 15:53:09
...

C语言版中缀表达式转后缀表达式

    I    通常,用户输入的表达是为中缀表达式,通过算法,将中缀表达式转化为后缀表达式,然后利用栈存储操作数,遇到operator,弹出栈中的操作数进行相应的运算后再圧栈,直至表达式运算完成或出错退出。

    

     II   利用“栈”将中缀表达式转化为后缀表达式算法:

        根据各种运算的运算符的优先级,优先级表格:

 操作符ch

#

(

*、/、%

+、-

)

Isp

0

1

5

3

6

Icp

0

6

4

2

1


    III    扫描中缀表达式,将它转化为后缀表达式的算法描述:

        1、 操作符栈初始化,将结束符“#”进栈。然后读入中缀表达式字符流的首字符ch;

        2、 I)若ch为操作数,直接输出,读下一字符;

               II)若ch是操作符,比较ch的优先级icp与当前栈顶操作符op的优先级isp:

                    If  icp(ch) > isp(op)  then  令ch进栈,读入下一个字符;

                    If  icp(ch) < isp(op)  then  弹栈并输出

                    If  icp(ch) == isp(op) then  弹栈但不输出,若退出的是“(”号则读入下一个字符ch。

        3、 算法结束,输出序列即为所求的后缀表达式。

    IV 算法C语言实现


//============================================================================
// Name        : fixTransform.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
//============================================================================

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

#define stkSize 20
#define maxSize 30

int isp(char op){
	switch(op){
	case '#' : return 0; break;
	case '(' : return 1; break;
	case '*' : return 5; break;
	case '/' : return 5; break;
	case '+' : return 3; break;
	case '-' : return 3; break;
	case ')' : return 6; break;
	default : return -1;
	}
}

int icp(char op){
	switch(op){
	case '#' : return 0; break;
	case '(' : return 6; break;
	case '*' : return 4; break;
	case '/' : return 4; break;
	case '+' : return 2; break;
	case '-' : return 2; break;
	case ')' : return 1; break;
	default : return -1;
	}
}

/**
 * 将中缀表达式in[]转化为后缀表达式post[]
 */
void infix_to_postfix(char in[], char post[]){
	char optr[stkSize];
	int top = -1;
	char ch, topOp, op;
	int i = 0, j = 0;

	//初始化符号栈
	optr[++ top] = '#';

	ch = in[i ++];
	while(-1 != top || '#' != ch){
		if(ch >= '0' && ch <= '9'){
			post[j ++] = ch;
			ch = in[i ++];
		}
		else {
			topOp = optr[top];
			if(icp(ch) > isp(topOp)){
				optr[++ top] = ch;
				ch = in[i ++];
			} else if(icp(ch) < isp(topOp)){
				op = optr[top --];
				post[j ++] = op;
			}
			else{
				op = optr[top --];
				if('(' == op){
					ch = in[i ++];	//消括号
				}
			}
		}
	}
	post[j] = '#';
}


int main() {
	char in[maxSize] = "5+9*(6-4)-9/3#\0", post[maxSize];
	for(int i = 0; '#' != in[i]; i ++){
		printf("%c", in[i]);
	}
	printf("\n");
	infix_to_postfix(in, post);
	for(int i = 0; '#' != post[i]; i ++){
		printf("%c", post[i]);
	}
	printf("\n");
	return EXIT_SUCCESS;
}

        运行结果截图:

栈实现中缀表达式转后缀表达式

望每天进步一点,栈实现中缀表达式转后缀表达式