本篇部落格主要講述內容:
面試題之用兩個棧實現乙個佇列
實現思路:
用兩個棧實現乙個佇列
類似於兩個佇列實現乙個棧,就主要體現出佇列的「先進先出的」原則,即實現push和pop兩個操作;
主要實現難點思路分析:
實現pop時就稍微有點技巧,如果s2不為空,則直接pops2,為什麼呢?
很簡單,如果s2不為空,說明經過上次pop之後,剩餘的s2並沒有還給s1,那s2的棧頂元素是不是目前最先進入佇列的元素!
比如: 1,2,3,4入棧
s1: 1>2>3>4; 4是棧頂;然後執行pop操作時;
s1: 1;//留下的最後乙個元素就是最先入棧即最先入佇列的元素;
pop掉 ;
執行完一次完整的pop後:
s1: //空的,_size = 0;
s2: 4>3>2 //2是棧頂
假設我們再push個5,6,7,則:
s1:5>6>7;
s2:4>3>2;
接下來又要pop; 按照佇列先進先出的原則,我們應該pop掉入棧最早的元素,現在的話就是2了;
如果s2有元素的話肯定都比s1內的元素入棧早,這個沒有問題吧! 那麼s2是s1倒過來的,那麼棧頂的元素肯定是最早入棧的;
那麼,2現在就在s2的棧頂,直接pop掉就可以了;pop操作後:
s1: 5>6>7;
s2: 4>3;
假設連續pop兩次之後:
s1:5>6>7;
s2: //空;
現在又要pop;那麼我們判斷s2為空了,那就又回到一開始的操作了!
****實現如下:**
#include
#include
using
namespace
std;
template
class queue
void pop()
cout
//兩個棧成員
stack
s1;stack
s2;};int main()
面試題之 用兩個棧實現佇列
題目很簡單,與之相似的還有用兩個佇列實現棧,思路類似都是用乙個村乙個倒,類似負負得正嘛。具體分析一下兩個棧實現佇列,設這兩個分別為s1和s2,我們從入隊開始,最開始只要直接壓倒s1中,然後出隊,此事要先將元素全部彈到出再放到s2中 現在的問題是當兩個棧都有東西的時候要怎麼處理,其實分析一下我們發現s...
面試題(兩個棧實現乙個佇列和兩個佇列實現乙個棧)
面試題 判斷元素出棧入棧順序的合法性。面試題 實現乙個棧,要求實現push 出棧 pop 入棧 min 返回最小值的操作 的時間複雜度為o 1 我們知道棧是後進先出的,而佇列是先進先出的 我們建立兩個棧input 輸入棧 output 輸出棧 我們用input 輸入棧 來負責入隊,而output 輸...
面試題 用兩個佇列實現乙個棧
在做這道題之前,我們首先要搞清楚佇列和棧的特點。佇列 先進先出,即插入資料在隊尾進行,刪除資料在隊頭進行 棧 後進先出,即插入與刪除資料均在棧頂進行。pop 如果我們要實現乙個棧,我們先進入的資料一定是先出去的,怎麼樣利用佇列實現這個特點呢?我們可以利用兩個佇列來進行資料順序的調整。當我們需要刪除資...