面试题7:用两个栈实现队列

来源:互联网 发布:java 短链接生成器 编辑:程序博客网 时间:2024/04/29 04:38

1.题目:用两个栈实现一个队列,完成在队列的尾部和插入节点和在头部删除节点的功能。

数据结构如下:

template <typename T> class CQueue{public:CQueue(void);~CQueue(void);// add the node to the tail of the queuevoid appendTail(const T& node);// delete the node from the head of the queueT deleteHead();private:stack<T> stack1;stack<T> stack2;};

分析:

栈的特性是先进后出,而队列的特性是先进先出。用两个栈来实现队列,肯定涉及到两个栈之间的数据的互相的进栈和出栈,例如在队列进行添加元素时,可以直接往stack1中压栈,此时先添加的元素在栈的底端,在出队列的时候就不能直接出栈了,要先将stack1中的元素弹出,然后依次压入栈stack2中,在出队列的时候顺序就是对的。如图所示:




源码:

#include<iostream>#include<stack>using namespace std;template <typename T> class CQueue{public:CQueue(void);~CQueue(void);// add the node to the tail of the queuevoid appendTail(const T& node);// delete the node from the head of the queueT deleteHead();private:stack<T> stack1;stack<T> stack2;};template <typename T> CQueue<T>::CQueue(void){}template <typename T> CQueue<T>::~CQueue(void){}template<typename T> void CQueue<T>::appendTail(const T& element){stack1.push(element);}template<typename T> T 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;}int main(){CQueue<char> queue;queue.appendTail('a');queue.appendTail('b');queue.appendTail('c');char head = queue.deleteHead();cout << "head is : " << head << endl;system("PAUSE");return 0;}


0 0