这篇page是针对leetcode上的232.用栈实现队列这道题所写的,小尼先简单的说明一下这道题,就是利用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty)。小尼首先说明一下栈的特点栈的特点是先入后出,队列的特点是先入先出。接下来小尼会讲解两种思路。上一下图:
大家可以先看看上面小尼写的思路啊,然后小尼再给各位实现一下它的各个功能:
public void push(int x){ if(s1.empty()) front = x;//此处的front是用来记录首节点的 while(!s1.isEmpty()) s2.push(s1.pop()); s2.push(x); while(!s2.isEmpty()) s1.push(s2.pop()); }
首先上面实现的push的功能,其实也就将小尼说的两个栈的好好利用实现了队列的功能,这里的写的方法和小尼上面图中所说的有一个地方不同,希望大家可以注意一下,小尼上面说先将s1的元素放入s2中,然后再把我们新入的元素放入s1中,再将s2中的元素放入回来,但是小尼上面写的代码是再将s1的元素放入之后直接就把新入的元素直接放到s2的最上面然后再将s2的元素放入s1中,但是区别不大。好,小尼继续写其他的方法的实现:
public void pop(){ s1.pop(); if(!s1.isEmpty()) front = s1.peek(); } public boolean empty(){ return s1.isEmpty(); } public int peek(){ return front; }
好的,小尼接下来说明一下第二种实现的方法,小尼先上一张图:
接下来小尼对着这个方法拉一下代码:
class MyQueue{ Deque<Integer> s1; Deque<Integer> s2; public void MyQueue(){ s1 = new ArrayDeque<Integer>(); s2 = new ArrayDeque<Integer>(); } public void push(x){ s1.push(x); } public int pop(){ if(s2.isEmpty()){ change(); } } public boolean empty(){ return s1.isEmpty() && s2.isEmpty(); } public void change(){ while(!s1.isEmpty()){ s2.push(s1.pop()); } } }
上述代码可以实现两个栈完成队列的功能