資料結構與演算法之棧

2021-10-13 12:36:00 字數 2281 閱讀 5096

需求

大家看到,字尾表示式適合計算式進行運算,但是人卻不太容易寫出來,尤其是表示式很長的情況下,因此在開發中,我們需要將 中綴表示式轉成字尾表示式。

演算法思路分析

1、初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;

2、從左至右掃瞄中綴表示式;

3、遇到運算元時,將其壓s2;

4、遇到運算子時,比較其與s1棧頂運算子的優先順序:

(1).如果s1為空,或棧頂運算子為左括號「(」,則直接將此運算子入棧;

(2).否則,若優先順序比棧頂運算子的高,也將運算子壓入s1;

(3).否則,將s1棧頂的運算子彈出並壓入到s2中,再次轉到(4-1)

5、與s1中新的棧頂運算子相比較;

遇到括號時:

(1) 如果是左括號「(」,則直接壓入s1

(2) 如果是右括號「)」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到左括號為止,此時將這一對括號丟棄

6、重複步驟2至5,直到表示式的最右邊

7、將s1中剩餘的運算子依次彈出並壓入s2

8、依次彈出s2中的元素並輸出,結果的逆序即為中綴表示式對應的字尾表示式

**實現

public

class

center_back_calculatordemo

//把中綴表示式轉換為字尾表示式

private

static list

parsesuffixexpressionlist

(list

infieexpressionlist)

else

if(ls.

equals

("("))

else

if(ls.

equals

(")"))

s1.pop();

//遇到運算子時

}else

s1.push

(ls);}

}//將s1中剩餘的運算子依次彈出並壓入list

while

(s1.

size()

!=0)return list;

}public

static list

toinfixexpression

(string expression)

else

list.

add(str)

; str="";

} i++;}

return list;}}

class

arraystack3

//判斷是否為空

public

boolean

isempty()

//判斷棧是否以滿

public

boolean

isfull()

//返回棧頂元素

public

intshow()

//入棧

public

void

push

(int value)

top++

; stack[top]

=value;

}//出棧

public

intpop()

int value=stack[top]

; top--

;return value;

}public

void

showlist()

system.out.

println

(stack[top]);

top--;}

}//獲取符號優先順序

public

static

intpriority

(string oper)

else

if(oper==

"+"||oper==

"-")

else

}//判斷是不是乙個符號

public

static

boolean

isoper

(char val)

//計算方法

public

static

intcal

(int num1,

int num2,

char oper)

return res;

}}

《資料結構與演算法》之棧

資料結構與演算法 之鍊錶 資料結構與演算法 之佇列 資料結構與演算法 之排序 資料結構與演算法 之二分查詢 資料結構與演算法 之二叉樹 關於 棧 我有乙個非常貼切的例子,就是一摞疊在一起的盤子。我們平時放盤子的時候,都是從下往上乙個乙個放 取的時候,我們也是從上往下乙個乙個地依次取,不能從中間任意抽...

資料結構與演算法之棧

中綴表示式實現多位數的計算 實現 public class calculatordemo else 否則直接入符號棧 else 如果是數字直接入數棧 else else index if index expresion.length 表示式掃瞄完後就順序的從數棧和符號棧中pop出相應的數字和符號並執...

資料結構與演算法之棧

字首表示式 求值 從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算 棧頂元素 和 次頂元素 並將結果入棧 重複上述過程直到表示式最左端,最後運算得出的值即為表示式的結果 例如 3 4 5 6 對應的字首表示式就是 3 4 5 6 針對字首表示...