《劍指offer》面試題9:用兩個棧實現佇列
阿新 • • 發佈:2018-12-02
題目:用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式appendTail 和deleteHead ,分別完成在佇列尾部插入節點和在佇列頭部刪除節點的功能。
template <typename T> class CQueue
{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
分析:當stack2 不為空時,在stack2 中的棧頂元素是最先進進入佇列的元素,可以彈出。當stack2 為空時,我們把stack1 中的元素逐個彈出並壓入stack2。由於先進入佇列的元素被壓到stack1 的底端,經過彈出和壓入操作之後就處於stack2 的頂端,又可以直接彈出。
參考程式碼如下:
template<typename T> void CQueue<T>::appendTail(const T& element) { stack1.push(element); } template<typename T> void CQueue<T>::deleteHead() { if(stack2.size()<=0) { while(stack1.size()>0) { T& data=stack1.top(); stack1.pop(); stack2.push(data); } } if(stack2.size()==0) throw new exception("queue is empty"); T head==stack2.top(); stack2.pop(); return head; }
測試用例:
a.往空的佇列裡新增、刪除元素。
b.往非空的佇列裡新增、刪除元素。
c.連續刪除元素直至佇列為空。