棧的經典運用
/************************************************
*當所有對象遍歷完成以后,需要判斷棧中是否存在對象
*棧中為空說明是平衡的,非空則說明是非空的對象
************************************************/
if(stack.isempty())
{
cout << "string is blanced!!" << endl;
return true;
}
else/*沒有正確的匹配,并輸出具體不匹配的符號*/
{
cout << stack.pop() << " " << "Unblance string!!" << endl;
return false;
}
}本文引用地址:http://www.biyoush.com/article/201612/324510.htm
采用上面的代碼能夠符號是否平衡的判斷。
接下來說明一下表達式的求值問題,表達式的求值問題主要設計到操作符的優(yōu)先級問題,比如()、*/、+-這幾種符號的優(yōu)先級是不一樣的,其中括號的優(yōu)先級最好,乘除其次,加減最低,我們通??吹降谋磉_式都是中綴表達式,也就是在操作符的兩邊都有對象,當然括號除外啦,這種中綴表達式是不便于在程序中處理的,因為存在很多的優(yōu)先級差別,很難把握從那個位置先計算。
如果在表達式中沒有了優(yōu)先級的問題,求值問題也就變得相對來說更加簡單了,后綴表達式是一種非優(yōu)先級的表達式表示方式,但是如何實現中綴表達式到后綴表達式的切換也是很難實現的。
中綴表達式到后綴表達式的實現如下:
中綴表達式:
a*b+c*d-e/f
后綴表達式:
ab*cd*+ef/-
從上面的表達式可以知道后綴表達式相對來說比較容易判斷計算的基本過程,而且不存在括號的煩惱。采用棧實現轉換的基本思路如下:
對一個中綴表達式進行遍歷,當遇到非操作符的字符直接保存到后綴表達式的存儲空間中,如果遇到左括號,則將左括號壓入棧中,因為優(yōu)先級最高,只有遇到右括號才會被彈出。如果遇到右括號,則將左括號之前的操作符全部彈出,并保存到后綴表達式的存儲空間中,當然這種存儲的順序和出棧的順序是一致的,括號操作符在后綴表達式中是不存在的,因此不需要將括號保存到后綴表達式的存儲空間中。如果遇到乘除操作符(*/),則判斷棧中的操作符優(yōu)先級是否低于當前的操作符也就是判斷是否是加減操作符,如果不是則將棧中的操作符(也就是*、/),并保存到后綴表達式存儲空間中,然后將當前的操作符壓入棧中,如果是則直接將操作符入棧。如果操作符是加減操作符,則彈出棧中左括號之前的所有操作符,并保存到后綴表達式存儲空間中,然后將操作符本身壓入棧中。當字符串遍歷完成以后,依次彈出操作符,并保存到后綴表達式存儲區(qū)中。
通過上面處理的中綴表達式就能完成后綴的轉換,但是由于需要比較操作符的優(yōu)先級問題,因此可能需要出棧以后,直接將對象又壓棧的問題,這是實現這類轉換時需要注意的。基本的實現如下:
/*****************************************
* 實現表達式中綴到表達式后綴的轉換
*****************************************/
bool midtolast(string &src, string &dst)
{
string::size_type len = src.size();
/*用來保存棧中彈出的對象*/
char temp =