棧和佇列之經典(下)

2021-08-13 15:24:51 字數 2450 閱讀 3220

(4)判斷元素出棧、入棧順序的合法性。如:入棧的序列(1,2,3,4,5),出棧序列為(4,5,3,2,1)是合法序列,入棧的序列(1,2,3,4,5),出棧序列為(1,5,3,2,4)是不合法序列 。

對於有關棧的問題,建立輔助棧解決會是很不錯的選擇。在本題中把輸入的入棧序列的數字依次壓入該輔助棧,並按照出棧序列依次從該棧中彈出數字。

規律:如果下乙個彈出的數字剛好是棧頂數字,那麼直接彈出;如果下乙個彈出的數字不在棧頂,則把壓棧序列中還沒有入棧的數字壓入輔助棧,直到把下乙個需要彈出的數字壓入棧頂為止;如果所有數字都壓入棧中後依然沒有找到下乙個彈出的數字,那麼該序列不可能是乙個合法的彈出序列。

bool ispoporder(int *stack_in,int *stack_out,int len_in,int len_out)

}if(s.size()==0)

return

true;

else

return

false;

}int main()

; int stack_out = ;//出棧序列合法

int stack_out = ;//出棧序列不合法

int len_in = sizeof(stack_in)/sizeof(stack_in[0]);

int len_out = sizeof(stack_out)/sizeof(stack_out[0]);

bool ret = ispoporder(stack_in,stack_out,len_in,len_out);

if(ret)

cout

<

cout

<

0;}

對於彈出序列為4 5 3 2 1的合法呼叫過程:

對於彈出序列4 5 2 3 1的不合法情況:

(5)乙個陣列實現兩個棧

通常用乙個陣列實現兩個棧有三種辦法

方法1.分奇偶位壓棧

陣列的奇數字放棧1的資料,陣列的偶數字放棧2的資料。

方法2.自中間向兩邊壓棧

將陣列從中間一分為二,棧1從中間向左依次壓棧,棧2從中間向右依次壓棧。

方法3.自兩邊向中間壓棧

綜上比較,對於方法一和方法二,若兩個棧所壓入元素多少不同,其中乙個棧壓入很少的元素時,就會造成空間資源浪費。當任何乙個棧的元素到達陣列的陣列尾部或者起始位置時,則開始擴容。

而方法三便可以避免上述空間浪費問題,當乙個棧的元素被pop掉後,另乙個棧可以占用該位置,因此資源利用率較高。

接下來我們實現自兩邊向中間壓棧的方案:

class arraytwostack

void stack1push(const

int& x)//壓棧

void stack2push(const

int& x)

void stack1pop()//出棧

void stack2pop()

const

int& stack1top()

const

int& stack2top()

size_t sizeofstack1()

size_t sizeofstack2()

void stack1print()

cout << endl;

}void stack2print()

cout << endl;

}protected:

void

checkcapacity()

}private:

int* _a;

int _capacity;

int stack1_size; //棧頂下標

增容情況:

棧和佇列之經典(上篇)

要完成下面關於棧和佇列的題目,首先要明白 棧的特性 後進先出 佇列的特性 先進先出 1 實現乙個棧,要求實現push 入棧 pop 出棧 min 返回最小值的操作 的時間複雜度為o 1 本題的關鍵是要得到棧的最小元素min,我們的第一反應可能是每次壓入乙個新的元素時,將棧裡所有元素排序,讓最小元素位...

棧和佇列經典題目彙總

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

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

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