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