1. 程式人生 > >《劍指offer》面試題9:用兩個棧實現佇列

《劍指offer》面試題9:用兩個棧實現佇列

題目:用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式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.連續刪除元素直至佇列為空。