LeetCode 如何用栈来实现队列

用栈实现队列

原题链接:点我传送
原题描述:使用栈实现队列的下列操作:

push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。

示例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:
你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。**

栈的特点是先入后出,而队列的特点是先入先出,很显然如果只用一个栈来实现队列是不可能的,我们可以考虑用两个栈来实现一个队列

  • 队列的核心操作无非就两个:一个是入队,一个是出队
  • 我们可以通过构建两个栈A,B,比如我输入到队列中的元素顺序是1->2->3,那么出队的顺序是1->2->3,我们需要怎么通过A、B两个栈来实现这个过程呢,首先我们用A栈来接收元素1->2->3,然后将A栈的元素全部弹出,那么弹出顺序是3->2->1,然后我们按A栈的弹出顺序压入B栈中3->2->1,然后再将B栈中的元素弹出就是1->2->3了。
  • 接下来就是实现了,现在的阶段就是一看就会,一写就跪。emmm
class MyQueue{
	Stack<Integer> A;//A栈
	Stack<Integer> B;//B栈
	int first;//用来记录栈顶元素
}

1、初始化

 Myqueue(){
       A = new Stack<>();
       B = new Stack<>();
       this.first = 0;
}

2、 将一个元素放入队列的尾部(入队)

//入队操作是将元素压入A栈中,如果B栈中有元素的时候就不能直接压入A栈中,
//需要将全部A栈中的元素先全部弹出压入B栈
public int push(int x){
	if(A.isEmpty()){
		first = x;
	}
	A.push(x);
}

3、 返回队列是否为空

public boolean isEmpty(){
	return (A.isEmpty() && B.isEmpty());
}

4、 返回队列首部的元素

public int peek(){
if(B.isEmpty()) return B.peek();
return first;
}

5、从队列首部移除元素
要从队列移除元素,也就是出队,也就是B进行出栈操作,如果B栈为空,就把A栈的元素全部弹出然后压入B栈中

	public int pop(){
	if(B.isEmpty()){
	while(A.isEmpty()){
		B.push(A.pop());
		}
		return B.pop();
	}
	return B.pop();
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值