前面幾篇寫的都是資料結構原理性內容,也在寫棧的時候提到了棧的應用場景很欠缺,所以這兩天把棧的幾個應用寫一寫,貼出來以後查閱方便。
棧的幾個典型應用例子包括:1、漢諾塔問題;2、括號匹配問題;3、迷宮老鼠問題;4、電路防交叉的佈線問題(接近括號匹配);5、就是這個部落格貼出來的車廂重排問題(其實是乙個排序問題,只不過要將排序過程展現出來)
這裡面應該要貼出來車廂重排問題是個什麼問題:大致意思就是進入車站的列車的車廂順序是混亂的,需要通過幾個緩衝軌道,將列車的車廂順序重新排列
下面貼出**:
下面是標頭檔案的內容,寫成類主要是為了幾個棧變數呼叫起來方便,相當於全域性變數:
#ifndef _h_stack_railroad_h
#define _h_stack_railroad_h
#include
#include
class stackrailroad
;#endif
下面是cpp檔案的內容:
#include "stackrailroad.h"
stackrailroad::stackrailroad(std::stack
& st)
stackrailroad::~stackrailroad()
void stackrailroad::deal(void)
因為涉及到要將m_resstack的top值返回來,
所以需要判斷是否為空,不然會出錯
else
if(!m_resstack.empty())
}/// 上面的任意一種壓棧情況滿足之後均需要到這個if( !m_stack.empty() )外面去
/// 因為如果不去外面的話,直接執行下面會導致相同的topval要去進緩衝棧,而如果
/// 不出去直接在下面再取一次topval又可能因為m_stack中沒有元素而報錯
}if( !m_stack.empty() )
}else
緩衝棧不為空,需要判斷棧頂元素和當前的topval是否匹配}}
if (idx == -1)表示含有元素的緩衝棧中,沒有滿足進入緩衝棧條件的
m_stackcache[idx].push(topval);
std::cout
<
<< idx<<:endl>
m_stack.pop();
}/// 判斷那個緩衝棧的元素進入到結果棧
for (int ii = 0; ii < num - 1; ii++)}}
}}}void stackrailroad::output(void)
下面是測試使用的例子,選取的是最占用緩衝棧空間的例子:1,n-1,n-2,…,2
#include
#include
#include "stackrailroad.h"
void main(void)
輸出的結果如下截圖
資料結構之棧的應用舉例
第乙個問題 對於括號匹配,我們可以使用棧進行實現,利用好棧的定義 先進後出,後進先出。因此,我們可以通過每次將每個字元 若存在,則判斷檢測的該字元相對應的那個字元是否為棧頂元素,若為棧頂元素,則將其推出,若不為棧頂元素,則繼續,直到最後,若棧空,則這一行字串是滿足括號匹配的,反之。如下 在這裡插入 ...
資料結構 棧應用
一 算術表示式的中綴表示 把運算子放在參與運算的兩個運算元中間的算術表示式稱為中綴表示式。例如 2 3 4 6 9 算術表示式中包含了算術運算子和算術量 常量 變數 函式 而運算子之間又存在著優先順序,不能簡單地進行從左到右運算,編譯程式在求值時,不能簡單從左到右運算,必須先算運算級別高的,再算運算...
資料結構 棧的應用
要求 首先將運算元棧opnd設為空棧,而將 作為運算子棧opter的棧底元素,這樣的目的是判斷表示式是否求值完畢 2 依次讀入表示式的每個字元,表示式須以 結尾,若是運算元則入棧opnd,若是運算子,則將此運算子c與opter的棧頂元素top比較優先順序後執行相應的操作,具體操作如下 i 若top的...