剑指Offer算法实现之七:用两个栈实现队列

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队尾插入节点和在队首删除节点的功能。
template <typename T>
class CQueue{
public:
    CQueue();
    ~CQueue();
    void appendTail(const T& node);
    T deleteHead();
private:
    stack<T> stack1;
    stack<T> stack2;
};
思路:
①队列是先进先出,而栈是后进先出。
②若一个序列先依次入栈A,然后依次出栈并入栈B(此时B栈为空),那么再从B中出栈。以上三个步骤就模拟了先进先出的栈。
③入队列可用入栈A模拟。
④注意:执行步骤②的条件是B栈为空,且“原子地”将A中元素依次弹入B中。“原子地”含义为步骤②过程中不可插入模拟入栈操作

编译环境:ArchLinux+Clang3.3,C++11

实现:

#include <iostream>
#include <stack>
#include <stdexcept>
using namespace std;

template <typename T>
class CQueue{
public:
    CQueue() = default; // 编译器合成版本即可满足要求
    ~CQueue() = default;
    void appendTail(const T& node);
    T deleteHead();
private:
    stack<T> stack1;
    stack<T> stack2;
};
template <typename T>
void CQueue<T>::appendTail(const T& node)
{
    stack1.push(node);
}
template <typename T>
T CQueue<T>::deleteHead()
{
    if (stack2.empty()){ //stack2为空时,弹出stack1中所有元素到stack2中
        while (!stack1.empty()){
            stack2.push(stack1.top());
            stack1.pop();
        }
    }
    if (!stack2.empty()){
        T node = stack2.top();
        stack2.pop();
        return node;
    }else{
        throw std::range_error("queue is empty");
    }
}

int main()
{
    CQueue<int> q;
    q.appendTail(1);
    q.appendTail(2);
    cout << q.deleteHead() << endl;
    q.appendTail(3);
    cout << q.deleteHead() << endl;
    cout << q.deleteHead() << endl;
}

你可能感兴趣的:(栈,队列)