資料結構之棧實現中綴轉字尾並計算結果

2022-09-12 22:54:20 字數 2511 閱讀 2829

給定乙個中綴,最後變為字尾的過程其實並不算複雜,下面分析一下過程:

1. 首先面對乙個中綴表示式,我們需要兩個棧,乙個用來存放運算子,即符號棧 operatorstack,乙個用來存放數字,運算子,即數字棧 numstack

2. 開始掃瞄中綴表示式

3.遇到運算元時,我們直接壓入數字棧,即numstack;

4.遇到運算子時,需要我們比較一下當前符號與棧頂符號的優先順序,這裡分以下三種情況

4.1 operatorstack為空,好的,我們直接壓入

4.2 operatorstack不為空,且當前符號的優先順序大於棧頂符號的優先順序,我們也直接壓入符號棧

4.3 operatorstack不為空,且當前符號的優先順序小於或者等於棧頂符號的優先順序,這是我們需要先將operatorstack的棧頂pop出並push到numstack,此處是乙個while迴圈,直到找出當前符號的優先順序大於符號棧棧頂符    號的優先順序為止,再將當前符號壓入operatorstack.

5.遇到括號時,有如下操作

5.1 如果是  "("  ,直接壓入符號棧.operatorstack;

5.2 如果是  ")"  ,則將符號棧棧內符號依次彈出,push進numstack,直到遇見  "("  為止,注意的是,這一對括號進入丟棄狀態,即  "(" 彈出,不會入任何棧,")" 也不會入任何棧

6.重複2-5,掃瞄中綴表示式,直到最後結束

7.最後將符號棧中符號順序彈出並加入數字棧

8.數字棧numstack輸出,結果的逆序就是我們要的字尾表示式

通過一中的過程分析我們可以看到,數字棧從頭到輸出之前並沒有進行任何彈棧操作,所以為了便於書寫,下面將數字棧採用arraylist來代替,且易於輸出

並且,如果採用索引去對中隊表示式進行掃瞄的話,會十分麻煩,所以我們採用以下思路,進行轉換並計算結果

中綴表示式 -->順序存放中綴表示式中數字,操作符以及括號的list集合 --> 根據上面一的思路轉成存放字尾表示式的元素的集合 rearlist-->遍歷rearlist進行計算

**如下:

package

com.ebiz.stack;

import

j**a.util.arraylist;

import

j**a.util.list;

import

j**a.util.stack;

/***

@author

yhj * @create 2019-07-24 15:51

* * 中綴表示式轉字尾表示式 */

public

class

middletorear

//中綴表示式的集合轉為字尾表示式的集合

private

static listgetrearlist(listlist)

else

if (s.equals("("))

else

if (s.equals(")"))

//把左括號彈出來

operatorstack.pop();

//判斷優先順序,當前符號優先順序小於等於符號棧棧頂優先順序,將符號棧棧頂彈出加入數字棧,

//直到找到當前符號優先順序大於符號棧棧頂優先順序為止,再將當前符號加入符號棧

}else

//將當前符號加入符號棧

operatorstack.push(s);}}

//將符號棧中剩餘符號加入數字棧

while (operatorstack.size()!=0)

return

numlist;

}//將中綴表示式的各個字元存到list集合,方面遍歷

private

static listgetlist(string expression)

else

else}}

index++;

}while (index return

list;

}//輸出計算結果

private

static

int getresult(listlist)

else

else

if (s.equals("-"))

else

if (s.equals("*"))

else

if (s.equals("/"))

else

stack.push(""+result);}}

return

integer.parseint(stack.pop());

}}

上面涉及到的判斷符號優先順序的類

package

com.ebiz.stack;

/***

@author

yhj * @create 2019-07-24 18:14 */

public

class

operpriority

return

result;

}}

有待完善...

資料結構棧之中綴表示式轉字尾

對於乙個中綴表示式,假設a b a b 我們對它從左至右進行遍歷,當遇到運算元時直接輸出 當遇到操作符且棧為空時,將操作符壓入棧 當遇到左括號時,將其入棧 當遇到右括號時,將棧中左括號上面的元素依次出棧並輸出,最後將左括號出棧 但不輸出 當遇到操作符時 此時棧非空 當棧頂元素也為操作符且優先順序大於...

資料結構06 棧 中綴 字首 字尾

1.字首表示式 波蘭表示式 運算子位於運算元之前 3 4 5 6 求值機制 自右向左掃瞄整個字首表示式,遇到數字壓棧 遇到運算子,彈出棧頂和次棧頂元素,進行計算後重新入棧 2.中綴表示式 就是我們常見的表示式 3 4 5 6 3.字尾表示式 逆波蘭表示式 運算子位於運算元之後 3 4 5 6 求值機...

利用棧和佇列資料結構實現中綴轉字尾表示式

中綴轉字尾 字尾表示式的運算過程 遇到數字入棧,遇到運算子從棧中彈出兩個元素,結算結果,結果入棧,繼續掃瞄.中綴轉字尾 1.掃瞄字串,遇到數字,入隊 2.遇到符號 2.1 如果棧為空則入棧 2.2 符號為左括號則入棧 2.3 符號為右括號,則依次彈出棧頂符號入隊,直到遇到左括號 2.4 如果棧不為空...