本次写的题目是用栈实现队列,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎
🌱分析阶段
本题与LeetCode第225题——用队列实践栈的思路大同小异。
本题题目十分清晰,就是通过利用栈来实现队列的功能。
我们都知道队列的特点是先进先出,而栈的特点却是先进后出,完全相反的两个特点。所以要想单凭一个栈是无法实现模仿的,在这里我们先用两个栈来尝试一下。这个过程自己画图做思考。
在简单的尝试后,我们发现其是可行的。只需要创建两个栈,分别命名为stack1和stack2。其中stack1用于专门放入元素,stack2用于专门出元素。每当进元素就进入stack1,然后如果stack2是空的,就把stack1中的全部元素倒过去,此时若还要入元素,继续放入stack1,然后如果要出,若stack2中还有元素,就先不要从stack1里面倒过去,直至stack2中出元素出空了之后,若还要出,这是才从stack1里面出出来。图示如下👇:
问题思路较为清晰,到此时已经分析的较为清楚了,接下来让我们直接进入代码阶段吧😎
🌱代码阶段
我们按照一个一个函数来进行代码编写。首先是要创建两个栈,分别命名为stack1和stack2,如下代码👇:
import java.util.*;
class MyQueue {
public Stack<Integer> stack1 = new Stack<>();
public Stack<Integer> stack2 = new Stack<>();
public MyQueue() {
}
public void push(int x) {
}
public int pop() {
}
public int peek() {
}
public boolean empty() {
}
}
🍃push函数
push函数特别简单,只需要将要放入的元素放入stack1就好。具体代码如下👇:
import java.util.*;
class MyQueue {
public Stack<Integer> stack1 = new Stack<>();
public Stack<Integer> stack2 = new Stack<>();
public MyQueue() {
}
public void push(int x) {
stack1.push(x);
}
//其他未写函数省略
}
🍃pop函数
根据前面分析:若stack2为空的时候,需要判断stack1中有没有元素,若有元素则将stack1中的所有元素倒入stack2中,然后返回并弹出stack2的栈顶元素;若stack2不为空,则返回并弹出stack2的栈顶元素。具体代码如下👇:
import java.util.*;
class MyQueue {
public Stack<Integer> stack1 = new Stack<>();
public Stack<Integer> stack2 = new Stack<>();
public MyQueue() {
}
public void push(int x) {
stack1.push(x);
}
public int pop() {
if(stack2.empty()){ //当stack2为空时
while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
//其他未写函数省略
}
🍃peek函数
peek函数的思路与pop函数的思路差不多,我们只需要将最后的返回并弹出stack2的栈顶元素改为👉返回stack2的栈顶元素,但是不弹出。即可。具体代码如下👇:
import java.util.*;
class MyQueue {
public Stack<Integer> stack1 = new Stack<>();
public Stack<Integer> stack2 = new Stack<>();
public MyQueue() {
}
public void push(int x) {
stack1.push(x);
}
public int pop() {
if(stack2.empty()){ //当stack2为空时
while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
public int peek() { //与pop的思路差不多
if(stack2.empty()){ //当stack2为空时
while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
stack2.push(stack1.pop());
}
return stack2.peek();
}else{
return stack2.peek();
}
}
//其他未写函数省略
}
🍃empty函数
要判断是否为空,我们只需要判断stack1和stack2是不是同时为空就好😎具体代码如下👇:
import java.util.*;
class MyQueue {
public Stack<Integer> stack1 = new Stack<>();
public Stack<Integer> stack2 = new Stack<>();
public MyQueue() {
}
public void push(int x) {
stack1.push(x);
}
public int pop() {
if(stack2.empty()){ //当stack2为空时
while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
public int peek() { //与pop的思路差不多
if(stack2.empty()){ //当stack2为空时
while(!stack1.empty()){ //当stack1不为空,就一直倒到stack2里
stack2.push(stack1.pop());
}
return stack2.peek();
}else{
return stack2.peek();
}
}
public boolean empty() {
return stack1.empty()&&stack2.empty();
}
}
以上,便是全部代码啦😎让我们来运行一下逝逝~
nice😎✨