(本博客旨在个人总结回顾)
题目描述:
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数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;
}
运行结果: