棧實現中綴表達式轉後綴表達式

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;
}

        運行結果截圖:


望每天進步一點,再見

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章