剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈

本文介绍如何使用两个栈实现一个队列的基本操作,包括在队尾添加元素和从队首移除元素的方法。同时探讨了利用两个队列来模拟栈的行为,为数据结构的设计提供新的视角。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

题目中用到栈,可以选择用java.util.Stack类,作者想自己写一个,所以就没用。

自己写栈类的话, 也是参考了java.util.Stack类源码,

第一,栈需要一个容器,我们选择用数组来做容器,容器的初始大小设为10.当栈里数据要超过10时,自动扩容。参看扩容源代码:

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    } 

这里我们不需要做的那么复杂就用最后一句话即可

elementData = Arrays.copyOf(elementData, newCapacity); 

自己写的简单版栈代码如下:

public class test1 {
	/**
	 * 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。
	 * @param args
	 */
    public static void main(String[] args){
    	StackTest<String> stackTest=new test1().new StackTest<String>();
    	stackTest.push("1");
    	stackTest.push("2");
    	stackTest.push("3");
    	stackTest.push("4");
    	stackTest.push("5");
    	stackTest.push("6");
    	stackTest.push("7");
    	stackTest.push("8");
    	stackTest.push("9");
    	stackTest.push("10");
    	stackTest.push("11");
    	stackTest.push("12");
    	System.out.println(stackTest.getSize());
    	System.out.println(stackTest.capacity);
	}
    /**
     * 栈
     * @author Administrator
     *
     * @param <T>
     */
    class StackTest<T>{
    	//容器容量
    	int capacity=10;
    	//容器数组
    	protected Object[] elements=new Object[capacity];
    	//元素数量
    	int elementsCount;
    	//方法将元素放入栈内
    	protected T push(T node){
    		elements[elementsCount++]=node;
    		resetSize();
    		return node;
    	}
    	//方法将栈顶元素取出
    	protected void pop(){
    		elements[elementsCount--]=null;
    	}
    	//获取栈元素数量
    	protected int getSize(){
    		return elementsCount;
    	}
    	//根据条件扩容容器容量
    	protected void resetSize(){
    		if(elements.length-elementsCount<=0){
    			capacity=capacity+5;
    			elements = Arrays.copyOf(elements, capacity);
    		}
    	}
    }
   
}

栈有了 队列就实现了,

添加元素到队尾:直接往栈1里push,

删除队头元素:将栈1的元素pop出来push到栈2,然后栈2pop最上边的元素就相当于删除队头元素。

实现代码如下:

    /**
     * 队列
     * @author Administrator
     *
     * @param <T>
     */
    class QueueTest<T>{
    	StackTest<T> stack1;
    	StackTest<T> stack2;
    	
    	//添加元素到队尾
    	protected void appendTail(T node){
    		stack1.push(node);
    	}
    	//删除队列头部元素
    	protected T deletedHead(){
    		while(!stack1.empty()){
				stack2.push(stack1.pop());
    		}
    		return stack2.pop();
    	}
    	
    }

题目2:两个队列实现一个栈

因为队列的实现比栈的实现稍微复杂一点,这里就不自己实现了,想自己实现的同学可以参看下边的文章

http://blog.youkuaiyun.com/javazejian/article/details/53375004

java提供现成的工具类链式队列LinkedList。

这里我只说下思路,就不码代码了;

pop方法的实现:假设对列1有n个元素,将队列1的前n-1个元素deletehead,然后addTrail到队列2,这样相当于将队列1的第n个元素pop出栈。

push的实现:队列addTrail即可


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值