栈与队列

1.用2个栈实现一个队列(剑指offer——面试题7)

思想:往队尾添加结点的时候,就是把当前结点压入stack1中。删除队首的结点时,首先判断stack2是否为空,如果stack2为空,则把stack1中的所有结点都压入到stack2中。如果stack2仍然为空,说明队列为空。删除stack2中的栈顶结点。

#include<stack>

#include<queue>

#include<iostream>

using namespace std;



//用2个栈实现队列

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> 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;

}

2.用2个队列实现一个栈

思想:第一个结点可以随意往任意空栈中添加。接下来往栈中添加结点的时候就是把结点压入非空的那个栈的末尾。删除结点时,依次删除非空队列中的结点,并且压入到另一个队列中,直到当前队列剩下最后一个结点,将其删除。

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