面試題之用兩個棧實現乙個佇列

2021-07-22 16:55:50 字數 1146 閱讀 1247

本篇部落格主要講述內容:

面試題之用兩個棧實現乙個佇列

實現思路:

用兩個棧實現乙個佇列

類似於兩個佇列實現乙個棧,就主要體現出佇列的「先進先出的」原則,即實現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 如果我們要實現乙個棧,我們先進入的資料一定是先出去的,怎麼樣利用佇列實現這個特點呢?我們可以利用兩個佇列來進行資料順序的調整。當我們需要刪除資...