hello大家好呀,本博客目的在于记录暑假学习打卡,后续会整理成一个专栏,主要打算在暑假学习完数据结构,因此会发一些相关的数据结构实现的博客和一些刷的题,个人学习使用,也希望大家多多支持,有不足之处也请指出,谢谢大家。
前言
为了更深入理解栈和队列,本篇博客我将介绍力扣上两道栈和队列的转化问题。
一,力扣225,用队列实现栈
. - 力扣(LeetCode)
我们知道栈的特点是先进后出,队列是先进先出,因此,我们需要两个队列才能实现一个栈,通过队列中元素的转移来获取我们想要删除的元素,下面逐一介绍各个方法
1:push
根据后面的pop()方法和我们需要实现栈的特性可知,我们每次需要在两个队列中非空的队列中插入元素(插入元素肯定是插在一个队列中),如果都为空,则指定一个队列插入
public void push(int x) {if (!q2.isEmpty()) {q2.offer(x);} else if (!q1.isEmpty()) {q1.offer(x);} else {q1.offer(x);}
2.empty
我们先看empty,因为后面方法需要用到,显然,两个队列均为空则模拟栈空
public boolean empty() {return q1.isEmpty()&&q2.isEmpty();}
3.pop
pop方法我们的思路是如果哪个队列不空,则把队列中的size-1个元素移动到另一个队列,剩下的便是不需要的数(虽然看起来代码多但是else里的只需要把if里的改下就行)
public int pop() {if (empty()){return -1;}if(!q2.isEmpty()){int size=q2.size();for (int i = 0; i < size-1; i++) {q1.offer(q2.poll());}return q2.poll();}else {int size=q1.size();for (int i = 0; i < size-1; i++){q2.offer(q1.poll());}return q1.poll();}}
4.empty
与pop类似,只是我们不需要删除元素,而且需要一个整形纪录栈顶元素
public int top() {if (empty()){return -1;}if(!q2.isEmpty()){int size=q2.size();int val=0;for (int i = 0; i < size; i++) {val=q2.poll();q1.offer(val);}return val;}else {int size=q1.size();int val=0;for (int i = 0; i < size; i++) {val=q1.poll();q2.offer(val);}return val;}}
完整代码
class MyStack {Queue<Integer> q1;Queue<Integer> q2;public MyStack() {q1=new LinkedList();q2=new LinkedList();}public void push(int x) {if (!q2.isEmpty()) {q2.offer(x);} else if (!q1.isEmpty()) {q1.offer(x);} else {q1.offer(x);}}public int pop() {if (empty()){return -1;}if(!q2.isEmpty()){int size=q2.size();for (int i = 0; i < size-1; i++) {q1.offer(q2.poll());}return q2.poll();}else {int size=q1.size();for (int i = 0; i < size-1; i++){q2.offer(q1.poll());}return q1.poll();}}public int top() {if (empty()){return -1;}if(!q2.isEmpty()){int size=q2.size();int val=0;for (int i = 0; i < size; i++) {val=q2.poll();q1.offer(val);}return val;}else {int size=q1.size();int val=0;for (int i = 0; i < size; i++) {val=q1.poll();q2.offer(val);}return val;}}public boolean empty() {return q1.isEmpty()&&q2.isEmpty();}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/
二,力扣232,用栈实现队列
. - 力扣(LeetCode)
思路:和上面类似,不过这里push方法都是放到第一个栈,出队操作分两步:
1.判断第二个栈是不是空的?如果是,则把第一个栈中所有元素都放到第二个栈里,取出第二个栈当中的栈顶元素。
2.如果不是空的,直接取出第二个栈中的栈顶元素
代码:
class MyQueue {Stack<Integer> s1;Stack<Integer> s2;public MyQueue() {s1 = new Stack<>();s2 = new Stack<>();}public void push(int x) {s1.push(x);}public int pop() {if (empty())return -1;if (s2.isEmpty()) {int size = s1.size();for (int i = 0; i < size; i++) {s2.push(s1.pop());}return s2.pop();} else {return s2.pop();}}public int peek() {if (empty())return -1;if (s2.isEmpty()) {int size = s1.size();for (int i = 0; i < size; i++) {s2.push(s1.pop());}return s2.peek();} else {return s2.peek();}}public boolean empty() {return s1.isEmpty() && s2.isEmpty();}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/
好了,今天练车耽误了一下,今天就到这里吧,谢谢大家