100題 第五十七題 用兩個棧實現佇列

2022-09-17 12:18:09 字數 1763 閱讀 6591

一,題目

某佇列的宣告如下:

templateclass cqueue

~cqueue() {}

void deletehead(); // remove a element from head

private:

t m_stack1;

t m_stack2;

};

二,分析

棧:**先出,插入刪除在棧頂操作

佇列:先入先出,插入在隊尾,刪除在隊首

因此對佇列進行的插入和刪除操作都是在棧頂上進行;

我們總是把新元素插入到佇列的尾部,而從佇列的頭部刪除元素。

1)stack1  入隊佇列 的棧

2)stack2  出隊佇列 的棧,如果出佇列時候,stack2為空則將stack1中元素全部彈入stack2,然後出棧

三,參考**如下:

templatevoid cqueue::deletehead() //出隊

}assert(m_stack2.size() > 0);

m_stack2.pop();

}擴充套件:用兩個佇列實現乙個棧?

思路:1.有兩個佇列q1和q2,先往q1內插入a,b,c,這做的都是棧的push操作。

2.現在要做pop操作,即要得到c,這時可以將q1中的a,b兩個元素全部dequeue並存入q2中,這時q2中元素為a,b,對q1再做一次dequeue操作即可得到c。

3.如果繼續做push操作,比如插入d,f,則把d,f插入到q2中,

4.此時若要做pop操作,則做步驟2

5.以此類推,就實現了用兩個佇列來實現乙個棧的目的。

注意在此過程中,新push進來的元素總是插入到非空佇列中,空佇列則用來儲存pop操作之後的那些元素,那麼此時空佇列不為空了,原來的非空佇列變為空了,總是這樣迴圈。

對於push和pop操作,其時間為o(n).

#include #include #include using namespace std;

// 兩個佇列實現乙個棧

templateclass cstack

~cstack() {}

void mypush(const t& element);

void mypop();

private:

deque m_queue1;

deque m_queue2;

};templatevoid cstack::mypop() //出棧

assert(m_queue2.size() == 1); //確保佇列2內有乙個元素

t& result = m_queue2.front();

m_queue2.pop_front();

cout << result << endl;

}else if (m_queue2.size() == 0)

assert(m_queue1.size() == 1); //確保佇列1內有乙個元素

t& result = m_queue1.front();

m_queue1.pop_front();

cout << result << endl;

}}templatevoid cstack::mypush(const t& element)//入棧

else if (m_queue2.size() > 0)

else

}int main()

用兩個棧實現佇列 用兩個佇列實現棧

劍指offer 面試題7 用兩個棧實現佇列。templateclass cqueue 我們試著用兩個棧來模擬佇列的操作,發現如下可行操作 完整 實現 面試題7 用兩個棧實現佇列 分別完成在隊尾插入結點和在隊頭刪除結點的功能。date 2014 06 27 include include includ...

演算法題 用兩個棧實現佇列

用兩個棧實現佇列 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。思路 1.stack是先進後出,而佇列是先進先出。2.stack1用於插入,運用另乙個stack2插入從stack1中彈出的資料後,資料的順序就會反轉。stack integer stack1 new...

兩個閒玩娛樂 微軟面試100題 第六十七題

題目要求 1.撲克牌的順子 從撲克牌中隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2 10為數字本身,a為1,j為11,q為12,k為13,而大小王可以看成任意數字。參考資料 劍指offer第44題。2.骰子遊戲 n個骰子的點數。把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入...