給定乙個中綴,最後變為字尾的過程其實並不算複雜,下面分析一下過程:
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進行計算
**如下:
packagecom.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());
}}
上面涉及到的判斷符號優先順序的類
packagecom.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 如果棧不為空...