棧和佇列都是比較常用的資料結構。棧的應用非常的廣泛,比如說,遞迴函式的實現就是借助於棧儲存相關的資料。作業系統中每個執行緒也會使用棧來儲存函式呼叫涉及到的一些引數和其他變數等。棧最大的乙個特點就是先進後出(filo—first-in/last-out)。
佇列和棧不同的是,佇列是一種先進先出(fifo—first in first out)的資料結構。
對應的stl中都有實現了的方法。
入棧,s.push(x)
出棧,s.pop()
訪問棧頂,s.top()
判斷棧空,s.empty()
訪問棧中的元素個數,s.size()
佇列的方法與棧大同小異,列舉如下:
入隊,q.push(x)
出隊,q.pop()
訪問隊首元素,q.front()、訪問隊尾元素,q.back()
判斷佇列空,q.empty()
訪問佇列中的元素個數,q.size()
注意,兩者的pop()方法,僅僅刪除棧頂和佇列首元素,並不返回,如需截獲元素,在pop()方法之前使用top()或者front()方法。
1 template class分析:這道題是要求通過兩個「先進後出」的操作完成「先進先出」的功能。下面這個例子比較形象的給出了實現的過程。cqueue
2;
起初的時候,兩個棧都為空,那麼只要有元素來,那麼預設插入到第乙個棧。這是,如果要求刪除乙個元素,那麼元素已經不在棧頂,在第乙個棧中肯定無法直接刪除了,此時我們發現第二個棧還沒有派上用場,這裡用到了,把第乙個棧中的元素壓入到第二個棧中,可以發現原來在第乙個棧中棧底的元素已經出現在第二個棧的棧頂上,所以刪除的功能就實現了。如果這個時候,「佇列」裡還有元素,我們還可以繼續出隊,而且,現在要出隊的元素就在第二個棧的棧頂,所以直接出棧即可。
分析到現在,下面給出總結:如果棧2不為空,同時又需要出隊,那麼順其自然直接彈出即可。如果棧2為空,那麼從棧1中逐個彈出壓入,那麼完整的實現了先進先出的功能。
具體的流程和**實現如下:
用兩個佇列實現棧。
分析:結合下圖,我們分析一下具體的流程,搞清楚了相關的流程,那麼對應的操作就明晰了。
起初的時候,兩個佇列都是空的,那麼當「棧」要壓入乙個元素,我們就預設將該元素壓入到佇列1中。接下來繼續壓入剩餘的元素。
接下來考慮,如果我們想要彈出乙個元素如何操作。棧中要求出棧的為棧頂元素,那麼即為最後插入的元素,但是該元素在佇列的尾部,必須要求前面的元素出隊後才能訪問,說到這裡,你也就發現思路的:出隊前面的元素,到另乙個佇列中,那麼就可以在原佇列中彈出唯一的元素了。
現在我們再考慮另乙個情況,佇列裡面還有元素,「棧」又進來了新的元素,那麼就將新元素,壓入到存在元素的那乙個佇列中,剩餘的操作,上面已經提到了,一樣的操作,看圖也許就清晰多了。
棧和佇列面試題(一)
一 實現乙個棧,要求push 入棧 pop 出棧 min 返回最小值的操作 的時間複雜度為o 1 思想 建立乙個棧,棧中儲存著入棧的值和當前棧中的最小值,每次入棧時都入棧兩個值,在入棧時先比較要插入的值與棧頂值得大小,通過打擂台的思想迴圈去比較,最終棧頂元素就是整個棧的最小值 注意 入棧最小值與當前...
棧和佇列面試題
遞迴反轉乙個棧 void reverse stack s reverse s int tmp2 s.top s.pop reverse s s.push tmp1 reverse s s.push tmp2 遞迴排序乙個棧 void sort stack s sort s int tmp2 s.to...
棧和佇列面試題
1.使用兩個棧,實現乙個佇列。棧 先進後出,且只能從棧頂pop出資料。佇列 先進先出,對頭pop資料,隊尾push資料。如下 include template class myqueue void pop else if stack2.empty private stack stack1 stack...