(本博客旨在個人總結回顧)
題目描述:
用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數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;
};
首先肯定理解數據結構隊列和棧的結構特點:
①棧爲先入後出結構。
②隊列爲先入先出結構。
完整程序:
template <typename T> class CQueue
{
public:
CQueue(void){};
~CQueue(void){};
void appendTail(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
template <typename T>
T CQueue<T>::deleteHead()
{
if (stack2.size() == 0)
{
while (stack1.size() > 0)
{
T node = stack1.top();
stack1.pop();
stack2.push(node);
}
}
if (stack2.size() == 0)
{
throw new std::exception("queue is empty");
}
else
{
T node = stack2.top();
stack2.pop();
return node;
}
}
template <typename T>
void CQueue<T>::appendTail(const T& node)
{
stack1.push(node);
}
int _tmain(int argc, _TCHAR* argv[])
{
//測試例子1 插入兩個數後刪除
CQueue<int> queue1;
cout << "測試例子1:" << endl << "插入:1, 2" << endl;
queue1.appendTail(1);
queue1.appendTail(2);
cout << "刪除:" << queue1.deleteHead();
cout << ", " << queue1.deleteHead() << endl;
//測試例子2 插入兩個數後刪除一個再插入兩個,再全部刪除
CQueue<int> queue2;
cout << "測試例子2:" << endl << "插入:3, 4" << endl;
queue2.appendTail(3);
queue2.appendTail(4);
cout << "刪除:" << queue2.deleteHead() << endl;
cout << "插入:5, 6" << endl;
queue2.appendTail(5);
queue2.appendTail(6);
cout << "刪除:" << queue2.deleteHead();
cout << ", " << queue2.deleteHead();
cout << ", " << queue2.deleteHead() << endl;
//直接刪除沒有數據的隊列
system("pause");
return 0;
}
運行結果: