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();
*/
好了,今天练车耽误了一下,今天就到这里吧,谢谢大家