(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...