棧和佇列之經典(上篇)

2021-08-13 09:17:27 字數 2116 閱讀 9969

要完成下面關於棧和佇列的題目,首先要明白

棧的特性:後進先出

佇列的特性:先進先出

(1)實現乙個棧,要求實現push(入棧)、pop(出棧)、min(返回最小值的操作)的時間複雜度為o(1) 。

本題的關鍵是要得到棧的最小元素min,我們的第一反應可能是每次壓入乙個新的元素時,將棧裡所有元素排序,讓最小元素位於棧頂,但是這樣破壞了棧的規律,它不能保證最後入棧的元素可以最先出棧。

同樣,建立乙個輔助棧存放最小元素,並且在最小元素出棧時我們希望能夠得到次小元素,是不是可以把每次的最小元素(之前的最小元素和新壓入棧的元素兩者的較小值)都儲存放進輔助棧,這樣可以保證在每次更新後輔助棧的棧頂元素即為當前棧的最小元素。

template

class stackwithmin

}void pop()

_num.pop();

}t min()

}private:

stack

_num;

stack

_min;

};int main()

過程圖:

(2)使用兩個棧實現乙個佇列

佇列特性:先進先出

我們通過乙個具體例子來分析往該佇列插入和刪除元素的過程。建立兩個棧s1和s2,如下圖:

**實現:

總的來說,入佇列就是直接壓到s1就行了;出佇列先把s1中的元素全部出棧壓入到s2中,彈出s2中的棧頂元素。

(3)使用兩個佇列實現乙個棧

我們通過一系列棧的壓入和彈出操作來分析用兩個佇列模擬乙個棧的過程。

**實現:

#include

class stackbytwoqueue

void push(const

int& x)

else

}void pop()

cout

q1.pop();

}else

cout

q2.pop();}}

const

int& top()//取棧頂

return q1.front();

}else

return q2.front();}}

size_t size()

bool empty()

private:

queue

q1;queue

q2;};int main()

{ stackbytwoqueue s;

s.push(1);

s.push(2);

s.push(3);

s.push(4);

cout

結果:

棧和佇列之經典(下)

4 判斷元素出棧 入棧順序的合法性。如 入棧的序列 1,2,3,4,5 出棧序列為 4,5,3,2,1 是合法序列,入棧的序列 1,2,3,4,5 出棧序列為 1,5,3,2,4 是不合法序列 對於有關棧的問題,建立輔助棧解決會是很不錯的選擇。在本題中把輸入的入棧序列的數字依次壓入該輔助棧,並按照出...

棧和佇列經典題目彙總

1.用兩個棧實現 入棧 乙個棧作為資料棧,乙個棧作為最小值棧,往資料棧中直接壓入資料,比較此時資料棧棧頂元素和min棧棧頂元素的大小,若min棧的棧頂元素小,則往min棧中壓入棧頂元素,若要資料棧棧頂元素小,則壓入資料棧棧頂元素。出棧 資料棧和min棧同時pop 取最小值 取min棧的棧頂元素 用兩...

資料結構之棧和佇列的經典面試題

在這個題目中要求要返回乙個棧裡面的最小值。有兩種方法 1 用兩個棧,乙個棧存入棧的資料,另乙個棧存對應的最小值,如果入棧的順序為5,8,1,3,4,則存最小值的那個棧存入的資料應該為5,5,1,1,1。2 與上邊一樣,用兩個棧,乙個放資料,另乙個放最小值,最小值由結構體組成有兩部分乙個是資料元素da...