剑指offer 面试题9:用两个栈实现队列(java代码)

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail
和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。

template<typename T> class CQqueue{
	public:
		CQueue(void);
		~CQueue(void);

		void appendTail(const T & node);
		T deleteHead();
	private:
		stack<T> stack1;
		stack<T> stack2;
};

分析:
栈是先进后出,队列是先进先出,用两个栈可以实现队列,先将数据压到一个栈中,然后再将这个栈中的数据压如第二个栈,那么第二个栈进行pop时就相当于队列的先进先出。删除数据时直接对第二个栈进行出栈即可,插入数据时将数据插入第一个栈就相当于在队列尾部插入数据。

public class _09 {
    public static void main(String[] args) {
        CQqueue<Integer> queue=new CQqueue<>();
        //进队列
        for(int i=0;i<10;i++){
            queue.appendTail(i);
        }
        //出队列
        for(int i=0;i<10;i++){
            System.out.print(queue.deleteHead()+" ");
        }
    }
}
class CQqueue<T>{
    private Stack<T> stack1;
    private Stack<T> stack2;

    public CQqueue(){
        stack1=new Stack<>();
        stack2=new Stack<>();
    }
    //在队尾插入元素,直接在stack1中插入即可。
    void appendTail(T node){
        stack1.push(node);
    }
    //删除队列头部节点
    T deleteHead(){
        //当stack2的容量为空时,如果stack1里面不为空,则将stack1中的数据压如stack2中
        if(stack2.size()<=0){
            while(stack1.size()>0){
                stack2.push(stack1.pop());
            }
        }
        if(stack2.size()==0){
            throw new RuntimeException("queue is empty");
        }
        //如果stack2的容量不为空时,要想对队列进行删除头部节点操作,直接对stack2进行出栈即可。
        T head=stack2.peek();
        stack2.pop();
        return head;
    }
}
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试
应支付0元
点击重新获取
扫码支付

支付成功即可阅读