7 月12日学习打卡--栈和队列的相互转换

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();
 */

好了,今天练车耽误了一下,今天就到这里吧,谢谢大家

相关推荐

  1. 717学习,数组

    2024-07-13 10:26:09       23 阅读
  2. 转换

    2024-07-13 10:26:09       32 阅读
  3. 数据结构9:相互实现

    2024-07-13 10:26:09       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 10:26:09       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 10:26:09       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 10:26:09       58 阅读
  4. Python语言-面向对象

    2024-07-13 10:26:09       69 阅读

热门阅读

  1. 面试题所有vue

    2024-07-13 10:26:09       22 阅读
  2. 求职学习day2

    2024-07-13 10:26:09       26 阅读
  3. Log4j的原理及应用详解(一)

    2024-07-13 10:26:09       26 阅读
  4. Log4j的原理及应用详解(二)

    2024-07-13 10:26:09       24 阅读
  5. 【uniApp】实现列表下拉触底加载更多功能

    2024-07-13 10:26:09       26 阅读
  6. 【第33章】MyBatis-Plus之预防安全漏洞

    2024-07-13 10:26:09       28 阅读
  7. 【安全设备】上网行为管理

    2024-07-13 10:26:09       26 阅读
  8. 智能小车——底层配置

    2024-07-13 10:26:09       27 阅读
  9. PCIe总线的序

    2024-07-13 10:26:09       26 阅读
  10. 怎么知道服务器100M带宽可以支持多少人访问?

    2024-07-13 10:26:09       27 阅读