剑指offer-07:两个栈实现队列

来源:互联网 发布:认字卡片软件 编辑:程序博客网 时间:2024/05/17 03:48

用两个栈实现队列。队列声明如下,实现其两个成员函数,分别完成在队尾插入和队头出队。

// 队列模版,可实现其中元素自定义template <typename T> class CQueue{public:    CQueue(void){};    ~CQueue(void){};    void appendTail(const T& node);// 队尾入队    T deleteHead();// 队头出队private:    stack<T> stack1;    stack<T> stack2;};

分析:

队列属于先进先出。栈属于先进后出。

  • 当队尾压进新元素,栈中直接压栈1即可
  • 队头删除元素时,将压栈1元素弹出,压入栈2,弹出栈2顶。栈2不空时,可尽管删除。一旦删除完毕,再要删除时则把栈1元素压进来
// 队尾插入,则压栈1template<typename T> void CQueue<T>::appendTail(const T& node){    stack1.push(node);}
// 队头删除template<typename T> T CQueue<T>::deleteHead(){    // 栈2为空?则把栈1全部压进来    if(stack2.size() <= 0)    {           while(stack1.size() > 0)        {            T& data = stack1.top();            stack1.pop();            stack2.push(data);        }    }    // 栈2仍为空?则队空无元素    if(stack2.size()==0)        throw new exception("queue is empty");    // 弹栈顶    T head =  stack2.top();    stack2.pop();    return head;}
// 测试int main(int argc, _TCHAR* argv[]){    CQueue<int> a;    a.appendTail(1); // 1    a.appendTail(2); // 1-2    a.appendTail(3); // 1-2-3    cout << a.deleteHead(); // 2-3    a.appendTail(4);        // 2-3-4    cout << a.deleteHead(); //   3-4    return 0;}
原创粉丝点击