栈编程题_剑指offer09_用两个栈实现队列

本文介绍了一种使用两个栈实现队列的方法,通过维护主栈和辅助栈或插入栈和删除栈,实现在队尾插入整数和在队头删除整数的功能。详细解释了两种实现方式,并提供了代码示例。

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

1 题目

leetcode
用两个栈实现队列。队列的声明如下,请实现它的两个函数 appendTail和deleteHand,分别完成在队尾插入整数和在队列头部删除整数的功能。(若队列中没有元素,deletehand操作返回-1)

2 解

2.1 主栈和辅助栈

维护两个栈,压入时直接压入主栈,取出时将主栈元素压入辅助栈,取辅助栈栈顶元素,再将辅助栈元素压入主栈中。

class CQueue {
	Stack<Integer> mainStack;
	Stack<Integer> SupportStack;
    public CQueue() {
		mainStack=new Stack<>();
		SupportStack=new Stack<>();
    }
    
    public void appendTail(int value) {
		//往主栈中压入
		mainStack.push(value);
    }
    
    public int deleteHead() {
		//主栈为空
		if(mainStack.isEmpty())
			return -1;
		//主栈非空
		//将主栈的元素压入辅助栈,辅助栈顶的元素即是想要的元素,最后将辅助栈的元素压回主栈。
		//压入辅助栈
		while (!mainStack.isEmpty()) {
			SupportStack.push(mainStack.pop());
		}
		//取出辅助栈顶元素
		int res=SupportStack.pop();
		//剩余元素压入主栈
		while (!SupportStack.isEmpty()) {
			mainStack.push(SupportStack.pop());
		}
		return res;
    }
}

想来想去还是无法突破两次while循环

3 官解

官解的思路是维护两个栈,一个用于插入,一个用于删除,插入时直接插入插入栈,删除时判断删除栈是否为空,为空则将插入栈的内容放入删除栈并删除栈顶元素,放入后的删除栈也为空就返回-1,注意删除栈的元素没有放回插入栈中。

class CQueue {
	Stack<Integer> insertStack;
	Stack<Integer> deleteStack;
    public CQueue() {
		insertStack=new Stack<>();
		deleteStack=new Stack<>();
    }
    
    public void appendTail(int value) {
		//往插入栈中压入
		insertStack.push(value);
    }
    
    public int deleteHead() {
		//删除栈为空
		if(deleteStack.isEmpty()) {
			//将插入栈的元素放入删除栈中
			while (!insertStack.isEmpty()) {
				deleteStack.push(insertStack.pop());
			}
		}
		//删除栈仍为空
		if(deleteStack.isEmpty())
			return -1;
		//非空则返回栈顶元素
		return deleteStack.pop();
    }
}

4 参考链接

1.官解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值