剑指Offer:两个栈实现队列

用两个栈实现一个队列。要求实现两个方法:appendTail()和deleteHead(),分别完成在队列尾部添加元素和头部删除元素的功能。

我们必须了解栈和队列的特点才能完成这一问题,栈:先进后出,队列:先进先出
设计思路:
我们将a,b,c压入stack1中,此时c在栈顶,删除数据不能在stack1中进行,我们可以将stack1中的数据全部弹出并且压入stack2中,然后对stack2进行删除数据。我们保证一点:添加针对stack1,删除针对stack2,删除时如果stack2为空就将stack1中的数据全部弹出并压入stack2中。
剑指Offer:两个栈实现队列_第1张图片

代码实现:
重点关注那两个方法,IntegerStack的实现参考这里

public class QueueWithStack {
    //当添加元素时往stack1中添加,删除时删除stack2的
    private IntegerStack stack1;
    private IntegerStack stack2;

    public QueueWithStack(int size){
        stack1 = new IntegerStack(size);
        stack2 = new IntegerStack(size);
    }

    public void appendTail(int num){
        stack1.Push(num);
    }

    public Integer deletHead(){
        if(stack2.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.Push(stack1.Pop());
            }
        }
        if(stack2.isEmpty()){
            System.out.println("队列为空!");
            return null;
        }
        return stack2.Pop();
    }
}

测试代码:


public class QueueWithStackTest {
    public static void main(String[] args) {
        QueueWithStack qs = new QueueWithStack(5);

        qs.appendTail(1);
        qs.appendTail(2);
        qs.appendTail(3);
        qs.appendTail(4);
        qs.appendTail(5);

        System.out.println(qs.deletHead());
        System.out.println(qs.deletHead());
        System.out.println(qs.deletHead());
        System.out.println(qs.deletHead());
        System.out.println(qs.deletHead());

    }
}

测试结果:
剑指Offer:两个栈实现队列_第2张图片

相关题目:两个队列实现栈。
有两个队列queue1和queue2,往queue1中插入a,b,c作为入栈操作,出栈操作应该将c弹出,所以我将queue1中c之前的数据都出队并插入queue2中再queue1将c出队作为出栈。
剑指Offer:两个栈实现队列_第3张图片

你可能感兴趣的:(剑指Offer,java,队列,栈,剑指Offer,Java实现)