棧是一種先進後出的資料結構,棧的應用很多,表示式求值問題就是乙個典型的應用,包含:括號匹配,中綴/字尾表示式的轉換以及字尾表示式求值…
使用棧,可以檢查乙個表示式的括號是否匹配,由於只關心括號的成對匹配,而不關心括號的類別,所以假設只包含()。
檢查括號匹配的演算法思路是:
① 依次遍歷表示式,記錄當前字元② 如果當前字元不是括號,繼續遍歷下乙個字元
③ 如果當前字元是左括號,入棧
④ 如果單曲字元是右括號,出棧;如果出棧元素是左括號,表示匹配一對括號,如果出棧元素是右括號或者此時棧空,括號不匹配。
⑤ 當表示式遍歷完成後,如果棧為空,表示括號匹配,否則不匹配。
public
static
boolean
isvalidexpression
(string expression)
break;}
}if(!stack.
isempty()
)return
true
;}
表示式可以直接求值運算,平時所寫表示式叫做中綴表示式;使用中綴表示式計算必須使用兩個棧,乙個用來記錄運算元,乙個用來記錄括號。並且中綴表示式會根據括號的優先順序導致無法從左向右順序計算,操作比較繁瑣。
字尾表示式:將運算子置於運算元之後的表示式;在字尾表示式中不再有括號。
比如中綴表示式:1+2*(3-4)+5,轉為字尾表示式的過程如下圖所示:
實現的具體演算法如下:為了方便比較各個運算子的優先順序,可以準備好乙個hashmap儲存各運算子的優先順序:① 遍歷中綴表示式,記當前字元為curchar
② 如果curchar是數字,新增到字尾表示式
③ 如果curchar是運算子,將curchar與棧頂運算子比較,如果棧頂運算子優先順序不低於curchar的優先順序,則出棧加入到字尾表示式,直到棧頂運算子優先順序低於curchar。
最後將curchar入棧
④ 如果curchar是左括號,入棧(左括號在棧中的優先順序最低)
⑤ 如果curchar是右括號,出棧加入字尾表示式,直到出棧的是左括號
⑥ 表示式遍歷完畢後,將棧中剩餘的運算子全部依次出棧,加入字尾表示式
public
static map
getoperatorpriority()
**實現如下:
public
static stringbuilder topostfix
(string infix)
i++;break
;case
'+':
case
'-':
case
'*':
case
'/':
case
'^':
while
(!stack.
isempty()
&& operatorpriority.
get(stack.
peek()
)>= operatorpriority.
get(curchar+"")
) stack.
push
(curchar +"")
; i++
;break
;default
://考慮到多位數字的情況,需要使用乙個迴圈來讀取連續的數字字元,並以空格分隔
while
(i(curchar <=
'9'&& curchar >=
'0')
) postfix.
(" ");
}}while
(!stack.
isempty()
)return postfix;
}
有乙個小細節需要注意,一般建議在迴圈中對字串的新增操作使用stringbuilder/stringbuffer,效率會高一些。
終於到了最重要的一步了。
字尾表示式的求值是一種順序求值,借助乙個數字棧,進行操作。
具體演算法如下:需要注意的是:由於可能出現123這樣的多位數字,而儲存是以字元為單位的,所以如果curchar是數字的話,需要將後面的數字字元先轉為乙個完整的數字,再進行操作(這時候就需要借助上面提到的使用空格分隔數字的技巧了)① 遍歷字尾表示式,記錄當前字元為curchar
② 如果curchar為數字,入棧
③ 如果curchar為運算子,則出棧兩個數,進行運算,運算結果再入棧
**如下:
public
static double tovalue
(stringbuilder postfix)
numstack.
push
(result);}
else
numstack.
push
(result);}
}}return result;
}
這樣的操作其實不算完美,實際的表示式還可以是浮點數,或者包含更多的括號以及運算子。就需要進一步的完善了。
棧應用 表示式求值
include stdafx.h include using namespace std const int explenght 20 const int stack init size 20 const int stack incrment 10 templateclass stack stack...
棧應用 表示式求值
include include define length 100 初始分配棧的長度 define add len 10 棧長增量 typedef struct 定義字元棧 sqstack void initstack sqstack s 初始化乙個棧 void push sqstack s,int...
表示式求值 棧的應用
表示式求值 西西設計的機械人卡多掌握了加減法運算以後,最近又學會了一些簡單的函式求值,比如,它 知道函式min 20,23 的值是20 add 10,98 的值是108等等。經過訓練,西西設計的機械人卡多 甚至會計算一種巢狀的更複雜的表示式。假設表示式可以簡單定義為 1.乙個正的十進位制數 x 是乙...