开始
再开始开始实现之前,首先将定读者已经理解了栈和队列的区别。
如果不理解的话,可以先看看这一篇,传送门:【算法】7 分不清栈和队列?一张图给你完整体会
用两个栈实现一个队列
这本来就是一道面试题,所以如果你感兴趣的话可以先自己实现一遍。这是队列的声明:
template <typename T> class CQueue{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T& node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
你要补充的就是在队列尾部插入结点和在队列头部删除结点的功能。
下面是图片演示过程,以及具体代码实现。
插入 a ,
b , c :往stack1 中依次压入了 a ,b , c删除队列头:将
c , b 依次从stack1 弹出和压入 stack2删除队列头:将 b 从
stack2 中弹出插入 d :往
stack1 中压入 d删除队列头:将
c 从 stack2 中弹出
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 exceptions("queue is empty");
}
T head = stack2.top();
stack2.pop();
return head;
}
用两个队列实现一个栈
写完了上面的代码,是不是也想换过来试一试呢?
同样是图片演示,以及具体代码实现。
插入 a :向
queue1 中压入 a插入
b :向 queue1 中压入 b 之前,先将a 压入到 queue2 中,再将 a 从queue1 中弹出插入 c ,
d :同上过程,最后如图所示从栈顶删除 d :将
queue1 中的 d 弹出从栈顶删除
c (1) : queue1 为空,此时先将 a 和b 依次压入 queue1 ,再从 queue2 中弹出从栈顶删除 c
(2) :将 queue2 中的 c 弹出,并将queue1 中的 a 和b 弹出再压入 queue2
template <typename T> class CStack {
public:
CStack(void);
~CStack(void);
void appendTail(const T& node);
T deleteHead();
private:
queue<T> queue1;
queue<T> queue2;
};
template <typename T> CStack<T>::CStack(void) {
}
template <typename T> CStack<T>::~CStack(void) {
}
template <typename T> void CStack<T>::appendTail(const T& element) {
if (queue1.size() >= 1) {
T& data = queue1.front();
queue1.pop();
queue2.push(data);
}
queue1.push(element);
}
template <typename T> T CStack<T>::deleteHead() {
T head;
if (queue1.size() >= 1) {
head = queue1.front();
queue1.pop();
}
else if (queue1.size() == 0&&queue2.size() > 0) {
while (queue2.size() > 1) {
T& data = queue2.front();
queue2.pop();
queue1.push(data);
}
head = queue2.front();
queue2.pop();
while (queue1.size() > 0) {
T& data = queue1.front();
queue1.pop();
queue2.push(data);
}
}
else {
throw new exception("stack is empty");
}
return head;
}