一、思路分析:
1、通過乙個index值(索引),來遍歷我們的表示式。
2、如果我們發現是乙個數字,就直接入數棧。
3、如果發現掃瞄到是乙個符號,就分如下情況:
(1)、如果發現當前的符號棧為空,就直接入棧。
(2)、如果符號棧有操作符,就進行比較,如果當前的操作符的優先順序小於或者等於棧中的操作符,就需要從數棧中pop出兩個數,在從符號棧中pop出-乙個符號,進行運算,將得到結果,入數棧,然後將當前的操作符入符號棧;如果當前的操作符的優先順序大於棧中的操作符,就直接入符號棧。
4、當表示式掃瞄完畢,就順序的從數棧和符號棧中pop出相應的數和符號,並執行。
5、最後在數棧只有乙個數字,就是表示式的結果。
二、**實現:
1、先實現一位數的運算
2、擴充套件到多位數的運算
具體**如下:
package com.ycx.stack;
public
class
calculator
else
}else
}else
else}}
//讓 index+1 ,判斷是否掃瞄到expression最後
index++;if
(index >= expression.
length()
)}/*當表示式掃瞄完畢,就順序的從數棧和符號棧中pop出相應的數和符號,並執行*/
while
(true
) num1 = numstack.
pop();
num2 = numstack.
pop();
oper = operstack.
pop();
res = numstack.
cal(num1,num2,oper)
;//運算結果入棧
numstack.
push
(res);}
//最後輸出結果
int res1 = numstack.
pop();
system.out.
printf
("表示式結果 %s = %d"
,expression,res1);}
}//先建立乙個棧
//定義乙個arraystack1 表示棧
class
arraystack1
//1、判斷棧滿
public
boolean
isfull()
//2、判斷棧空
public
boolean
isempty()
//3、入棧 push
public
void
push
(int val)
top++
; stack[top]
= val;
}//4、出棧 pop
public
intpop()
int val = stack[top]
; top--
;return val;
}//5、顯示棧(遍歷棧): 需要從棧頂開始遍歷
public
void
print()
//從棧頂開始
for(
int i = top; i>=
0; i--)}
//6、判斷符號的優先順序(優先順序由我們自己決定)
//可用數字表示優先順序:數字越大,優先順序越高
public
intpriority
(int oper)
else
if(oper ==
'+'|| oper ==
'-')
else
}//7、判斷是不是乙個運算子
public
boolean
isoper
(int val)
return
false;}
//8、計算
public
intcal
(int num1,
int num2,
int oper)
return res;
}//9、增加乙個方法,可以返回當前棧頂的值(不是pop)
public
intpeek()
}
執行結果如下: 資料結構 6 棧的應用之中綴表示式求值
參考書籍 資料結構 c語言版 嚴蔚敏 吳偉民編著 清華大學出版社 分析 設操作符棧op棧 運算元棧num棧 op棧裡不可能出現 只可能有 設ch為當前字元,假設輸入都是合法的 1.ch為 則op棧頂為 時ch入棧,否則進行運算直至op棧頂為 2.ch為 則op棧頂為 時ch入棧,否則op棧頂為 此時...
資料結構棧之中綴表示式轉字尾
對於乙個中綴表示式,假設a b a b 我們對它從左至右進行遍歷,當遇到運算元時直接輸出 當遇到操作符且棧為空時,將操作符壓入棧 當遇到左括號時,將其入棧 當遇到右括號時,將棧中左括號上面的元素依次出棧並輸出,最後將左括號出棧 但不輸出 當遇到操作符時 此時棧非空 當棧頂元素也為操作符且優先順序大於...
資料結構 棧實現表示式求值
expression.h calc expression 功能 利用棧實現整數表示式求值 輸入 表示式字串 輸出 求值結果 日期 2018 04 05 ifndef expression h define expression h include include include include 將中...