1. 程式人生 > >資料結構(6)--棧的應用之中綴表示式求值

資料結構(6)--棧的應用之中綴表示式求值

參考書籍:資料結構(C語言版) 嚴蔚敏 吳偉民編著 清華大學出版社

1.簡要說明

分析:設操作符棧op棧    運算元棧num棧
op棧裡不可能出現')',只可能有'+'、'-'、'*'、'/'、'(',設ch為當前字元,假設輸入都是合法的
    1.ch為'+'、'-',則op棧頂為'('時ch入棧,否則進行運算直至op棧頂為'('
    2.ch為'*'、'/',則op棧頂為'('、'+'、'-'時ch入棧,否則op棧頂為'*'、'/',此時要進行運算
    3.ch為數字,入num棧
    4.ch為'(',則入op棧
    5.ch為')',則迴圈計算直至出現op棧頂為'(',並彈出棧頂元素'('
    5.ch為'#',則輸入結束,此時應繼續迴圈計算至op棧為空,那麼彈出num棧棧頂元素即為運算結果

演算法的流程圖如下:


2.程式碼實現

//例項:(5*(12-3)+4)/2=24;4+2*3-10/5=8;
#include<stdio.h>
#define MAXSIZE 30
char op[MAXSIZE], num[MAXSIZE];//全域性變數
int opTop, numTop;
void calculate(){

	char op1, op2;
	int opf;
	op2 = num[numTop-1];
	numTop--;
	op1 = num[numTop-1];
	numTop--;
	opf = op[opTop-1];
	opTop--;

	int tmpResult = 0;
	switch(opf){
		case '+':
			tmpResult = op1 + op2;			
			break;
		case '-':
			tmpResult = op1 - op2;
			break;
		case '*':
			tmpResult = op1 * op2;
			break;
		case '/':
			tmpResult = op1 / op2;
			break;
	}
	num[numTop] = tmpResult;
	numTop++;
}
//處理簡單表示式
void dealExpression(){
	//初始化兩個棧
	opTop = 0, numTop = 0;

	printf("請輸入簡單表示式(以#號結束):");
	char currentChar;
	scanf("%c", ¤tChar);
	while(currentChar!='#'){
		switch(currentChar){
			case '+':
			case '-':
				while(opTop&&op[opTop-1]!='('){
					calculate();
				}								
				
				op[opTop] = currentChar;
				opTop++;
				scanf("%c", ¤tChar);
				break;
			case '*':
			case '/':
				if(opTop&&(op[opTop-1]=='*'||op[opTop-1]=='/')){
					calculate();
				}
				op[opTop] = currentChar;
				opTop++;
				scanf("%c", ¤tChar);
				break;
			case '(':
				op[opTop] = currentChar;
				opTop++;
				scanf("%c", ¤tChar);
				break;
			case ')':
				while(op[opTop-1]!='('){//當前是'(',則op棧一定能有'('匹配到,即op棧一定不為空
					calculate();
				}
				opTop--;//出棧,彈出左括號
				scanf("%c", ¤tChar);
				break;
			default://currentChar為數字,則入num棧
				int opNum = 0;
				do{
					opNum = opNum*10 + currentChar-'0';
					scanf("%c", ¤tChar);
				}while(currentChar>='0'&¤tChar<='9');
				num[numTop] = opNum;
				numTop++;
				break;
		}//end switch
	}
	while(opTop){
		calculate();
	}
	int result = num[numTop-1];
	printf("計算結果是%d\n", result);
}

3.演示

void main(){
	dealExpression();
}