本次写的题目是用队列实践栈,为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() {
-
- }
- }
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
按照前面分析阶段中来写代码:如果一开始两个队列都没有元素,就放入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);
- }
- }
- //其他未写代码暂时省略
- }
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
依据分析:将有元素的队列弹出(队列长度-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
1; i++){ - qu2.offer(qu1.poll());
- }
- return qu1.poll();
- }else{
- size = qu2.size();
- for(int i = 0; i
1; i++){ - qu1.offer(qu2.poll());
- }
- return qu2.poll();
- }
- }
-
- //其他未写代码暂时省略
- }
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
和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
1; i++){ - qu2.offer(qu1.poll());
- }
- return qu1.poll();
- }else{
- size = qu2.size();
- for(int i = 0; i
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
1; i++){ - qu2.offer(qu1.poll());
- }
- int f = qu1.poll();
- qu2.offer(f);
- return f;
- }else{
- size = qu2.size();
- for(int i = 0; i
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😎✨