本次写的题目是用队列实践栈,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎
🌱分析阶段
题意一目了然,就是用队列来实现栈的功能。
我们都知道队列的特点是先进先出,而栈的特点却是先进后出,完全相反的两个特点。所以要想单凭一个队列是无法实现模仿的,在这里我们先用两个队列来尝试一下。这个过程自己画图做思考。
在简单尝试后,发现该方法可行,我们只需要设置两个队列,分别命名为qu1和qu2。当两个队列都为空且要入栈的时候,先放入qu1队列里。而要出栈时,拥有元素的队列弹出队列长度-1个元素到另一个空队列中,而剩下的最后一个元素则就为要弹出的栈顶元素。图示如下👇:
问题思路较为清晰,到此时已经分析的较为清楚了,接下来让我们直接进入代码阶段吧😎
🌱代码阶段
我们按照一个一个函数来进行代码编写。首先是要创建两个队列,分别命名为qu1和qu2,如下代码👇:
import java.util.*; //注意这里要调用包
class MyStack {
public Queue<> qu1 = new LinkedList<>();
public Queue<> qu2 = new LinkedList<>();
public MyStack() {
}
public void push(int x) {
}
public int pop() {
}
public int top() {
}
public boolean empty() {
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
🍃push函数
按照前面分析阶段中来写代码:如果一开始两个队列都没有元素,就放入qu1;如果其中一个有元素,那么就放入有元素的里面。具体代码如下👇:
import java.util.*; //注意这里要调用包
class MyStack {
public Queue<> qu1 = new LinkedList<>();
public Queue<> qu2 = new LinkedList<>();
public MyStack() {
}
public void push(int x) {
if(qu1.size()==0&&qu2.size()==0){
qu1.offer(x);
}else if(qu2.size()!=0){
qu2.offer(x);
}else{
qu1.offer(x);
}
}
//其他未写代码暂时省略
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
🍃pop函数
依据分析:将有元素的队列弹出(队列长度-1)个元素到另一空队列中,最后剩下的那个元素就是我们要弹出的元素。具体代码如下👇:
import java.util.*; //注意这里要调用包
class MyStack {
public Queue<> qu1 = new LinkedList<>();
public Queue<> qu2 = new LinkedList<>();
public MyStack() {
}
public void push(int x) {
if(qu1.size()==0&&qu2.size()==0){
qu1.offer(x);
}else if(qu2.size()!=0){
qu2.offer(x);
}else{
qu1.offer(x);
}
}
public int pop() {
//题目提出无栈为空的情况,所以不讨论栈为空的情况
int size = 0;
if(qu1.size()!=0){
size = qu1.size();
for(int i = 0; i<size-1; i++){
qu2.offer(qu1.poll());
}
return qu1.poll();
}else{
size = qu2.size();
for(int i = 0; i<size-1; i++){
qu1.offer(qu2.poll());
}
return qu2.poll();
}
}
//其他未写代码暂时省略
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
🍃top函数
和pop函数差不多,只需要改成先记录下最后剩余元素,然后把最后一个元素转到另一个队列中,返回该最后元素的值即可😎具体代码如下👇:
import java.util.*; //注意这里要调用包
class MyStack {
public Queue<> qu1 = new LinkedList<>();
public Queue<> qu2 = new LinkedList<>();
public MyStack() {
}
public void push(int x) {
if(qu1.size()==0&&qu2.size()==0){
qu1.offer(x);
}else if(qu2.size()!=0){
qu2.offer(x);
}else{
qu1.offer(x);
}
}
public int pop() {
//题目提出无栈为空的情况,所以不讨论栈为空的情况
int size = 0;
if(qu1.size()!=0){
size = qu1.size();
for(int i = 0; i<size-1; i++){
qu2.offer(qu1.poll());
}
return qu1.poll();
}else{
size = qu2.size();
for(int i = 0; i<size-1; i++){
qu1.offer(qu2.poll());
}
return qu2.poll();
}
}
public int top() {
int size = 0;
if(qu1.size()!=0){
size = qu1.size();
for(int i = 0; i<size-1; i++){
qu2.offer(qu1.poll());
}
int f = qu1.poll();
qu2.offer(f);
return f;
}else{
size = qu2.size();
for(int i = 0; i<size-1; i++){
qu1.offer(qu2.poll());
}
int f = qu2.poll();
qu1.offer(f);
return f;
}
}
public boolean empty() {
if(qu1.size()==0&&qu2.size()==0) return true;
return false;
}
}
由于empty函数的思路很清晰,所以博主在上面代码一并写入了。
以上,就是全部代码了😎运行下逝逝吧~
nice😎✨