程式設計題 關於棧和佇列

2021-09-09 07:12:55 字數 2679 閱讀 6536

目錄

實現棧的求最小值函式(劍指歐肥兒)

棧的壓入,彈出序列(劍指歐肥兒)

用兩個棧實現佇列(劍指歐肥兒)

滑動視窗的最大值(劍指歐肥兒)

class solution ;
**思路:

宣告兩個棧,乙個是放所有值的棧(stackin),乙個是頂部放最小值的棧(stackmin)

壓入時,兩個棧都要壓入數,stackin壓入value;而stackmin需要和它棧中top位置的值比較,如果value小於等於stackmin.top()壓入value,如果value大於stackmin.top()則壓入stackmin.top()

彈出時,兩個棧都彈出頂端的數,這樣保證了兩個棧的同步性,保證stackmin的頂部是當前stackin整個棧的最小值。

返回stackin的頂端的值。

返回stackin裡的最小值,即stackmin裡的頂端值。

題目描述:

輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

解題答案:

class solution    

stack st //加入乙個輔助棧

int id = 0;

for(int i = 0; i < popv.size(); i++)

st.push(pushv[id++]);

}st.pop();

}if(st.empty())else

}}

**思路:

邊界值判斷,去除不符合條件的輸入向量

依次遍歷輸出棧(popv)的每乙個數,再迴圈判斷popv對應的數是否等於st(輔助棧)頂端的數,如果不等於則繼續壓入pushv的數,如果等於則st彈出這個數。注意迴圈的時候有可能一直沒找到符合條件的數,就會變成死迴圈,故判斷是否變數下標越界,越界直接false(因為這意味著彈出序列包含了壓入序列裡沒有的數)。

最後判斷輔助棧st是否為空,為空則彈出序列正確,否則不正確。

向量vector的大小:vector.size()

取向量vector裡的數:vector[i]  //取數類似於陣列

這道題的思維:

借用乙個輔助的棧,遍歷壓棧順序,先講第乙個放入棧中,這裡是1,然後判斷棧頂元素是不是出棧順序的第乙個元素,這裡是4,很顯然1≠4,所以我們繼續壓棧,直到相等以後開始出棧,出棧乙個元素,則將出棧順序向後移動一位,直到不相等,這樣迴圈等壓棧順序遍歷完成,如果輔助棧還不為空,說明彈出序列不是該棧的彈出順序。

舉例:入棧1,2,3,4,5

出棧4,5,3,2,1

首先1入輔助棧,此時棧頂1≠4,繼續入棧2

此時棧頂2≠4,繼續入棧3

此時棧頂3≠4,繼續入棧4

此時棧頂4=4,出棧4,彈出序列向後一位,此時為5,,輔助棧裡面是1,2,3

此時棧頂3≠5,繼續入棧5

此時棧頂5=5,出棧5,彈出序列向後一位,此時為3,,輔助棧裡面是1,2,3

題目描述:用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別。

**:

class solution

int pop()

}int a = stack2.top();

stack2.pop();

return a;

}private:

stackstack1;

stackstack2;

}

**思路:

壓棧就壓stack1.

彈出時,首先檢測stack2是不是空的,如果是空的,就把stack1裡從頂到底壓入stack1,再彈出stack2頂部資料;如果stack2不是空的,則直接把stack2的頂部資料彈出。

這樣做的好處,不會每一次壓棧都要重新生成一次stack2(因為生成stack2時間為把stack1全部n個節點壓入,時間為n),只有在stack2全部用完了,才會重新生成stack2。節約時間,而且省空間。

**核心:

if(stack2.empty()) 

}

題目描述:

給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為; 針對陣列的滑動視窗有以下6個: , , , , ,

解題**:

class solution 

}max.push_back(m);

}return max;

}};

這道題的思維:

不要引入棧!這道題和棧沒關係!

切入點很重要,切入點正確了,這道題就很簡單了。

棧和佇列B題

題目描述 description 在大學裡學習了乙個學期了,大家大都對所學的專業有了基本的了解。許多同學也已經知道了到大二要開一門課叫做 資料結構 那麼今天給你們提前講一下乙個最簡單的資料結構 棧。棧的基本操作有3種 push,pop,top。例如,給你乙個數列 1 2 3 4 push 向棧中加入...

刷題 棧和佇列

一 因為有太多遺忘的東西了,所以做題速度會很慢 現在理解題目,把題目理解好了,然後去看題解,看完題解,在去搜尋相關知識點進行補充。二 題目 三 理解 棧 先進後出 佇列 先進先出 要滿足題目的要求,我們要把棧底輸出出來,我們可以把棧倒著輸出,就可以滿足佇列的先進先出。所以我們需要兩個棧來,第乙個棧是...

棧和佇列 判斷題

二 判斷題 1.消除遞迴不一定需要使用棧,此說法 2.棧是實現過程和函式等子程式所必需的結構。3.兩個棧共用靜態儲存空間,對頭使用也存在空間溢位問題。4 兩個棧共享一片連續記憶體空間時,為提高記憶體利用率,減少溢位機會,應把兩個棧的棧底分別設在這片記憶體空間的兩端。5.即使對不含相同元素的同一輸入序...