一,題目
某佇列的宣告如下:
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。輸入...