java算法oj(3)栈和队列


目录

1.前言

2.正文

2.1基础操作

2.2用栈实现队列

2.2.1题目

2.2.2示例

2.2.3代码

2.3用队列实现栈

2.3.1题目

2.3.2示例

2.3.3代码

2.4最小栈

2.4.1题目

2.4.2示例

2.4.3代码

3.小结


1.前言

哈喽大家好吖,今天来分享几道栈与队列的算法题,操作比较基础但是思想比较重要,欢迎大家在评论区多多交流,废话不多说让我们直接开始吧。

2.正文

2.1基础操作

在正式开始之前,让我们先回顾一下栈与队列的基本操作。

栈(Stack):

栈是一种后进先出的数据结构。这意味着最后插入的元素会是第一个被移除的元素。栈的基本操作包括:

  1. push(value):将元素压入栈顶。
  2. pop():移除并返回栈顶元素。
  3. peek():返回栈顶元素但不移除它。
  4. isEmpty():检查栈是否为空。

队列(Queue):

队列是一种先进先出的数据结构。这意味着第一个插入的元素会是第一个被移除的元素。队列的基本操作包括:

  1. offer(value):将元素插入到队列的尾部(如果队列未满)。
  2. poll():移除并返回队列头部的元素(如果队列不为空)。
  3. peek():返回队列头部的元素但不移除它(如果队列不为空)。
  4. isEmpty():检查队列是否为空。

2.2用栈实现队列

2.2.1题目

测试链接 : 232. 用栈实现队列 - 力扣(LeetCode)


请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 只能 使用标准的栈操作 ------ 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

2.2.2示例

2.2.3代码

这道题如果有了思路实现起来就会比较容易。这道题的关键就在于如何仅通过栈先进后出结构实现队列的先进先出的结构,这里的解法就是通过利用俩个栈来模拟队列,看示意图:

创建一个in栈和out栈,先将123压入in栈中。

再将in栈中的元素压入out栈中。最后对out中的元素进行pop,peek等操作就是和队列一样,接下来附上代码:

java 复制代码
import java.util.Stack;

class MyQueue {

    public Stack<Integer> in;

    public Stack<Integer> out;

    public MyQueue() {
        in = new Stack<Integer>();
        out = new Stack<Integer>();
    }

    private void inout(){
        if(out.empty()){
            while(!in.empty()){
                out.push(in.pop());
            }
        }
    }

    public void push(int x) {
        in.push(x);
        inout();
    }

    public int pop() {
        inout();
        return out.pop();
    }

    public int peek() {
        inout();
        return out.peek();
    }

    public boolean empty() {
        return in.isEmpty() && out.isEmpty();
    }
}

2.3用队列实现栈

2.3.1题目

测试链接 :225. 用队列实现栈 - 力扣(LeetCode)


请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false

注意:

  • 你只能使用队列的标准操作 ------ 也就是 push to backpeek/pop from frontsizeis empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

2.3.2示例

2.3.3代码

如何仅使用队列的操作来实现栈呢,看示意图:

当队列仅有这一个元素时,此时此队列也满足栈的结构,但如果压入俩个元素该如何处理呢?

我们将2压入队列后,将1压出队列再压入队列,此时队列中的2,1满足栈的要求。

同理如果再压入3,将3前面的2,1都进行一次压入压出操作最后变成:

代码实现如下:

java 复制代码
import java.util.LinkedList;
import java.util.Queue;

class MyStack {

    Queue <Integer>queue;

    public MyStack() {
        queue = new LinkedList<Integer>();
    }

    public void push(int x) {
        int n = queue.size();
        queue.offer(x);
        for(int i = 0;i < n;i++){
            queue.offer(queue.poll());
        }
        n++;
    }

    public int pop() {
        return queue.poll();
    }

    public int top() {
        return queue.peek();
    }

    public boolean empty() {
        return queue.isEmpty();
    }
}

2.4最小栈

2.4.1题目

测试链接 :155. 最小栈 - 力扣(LeetCode)


设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

2.4.2示例

2.4.3代码

这道题的思路时用一个栈来存储,另一个栈用来实时标记当前栈最小值,这样就不用循环遍历,时间复杂度高了,代码实现如下:

java 复制代码
import java.util.Stack;

class MinStack {
    Stack<Integer> stack;
    Stack<Integer> stackmin;


    public MinStack() {
        stack = new Stack<Integer>();
        stackmin = new Stack<Integer>();
    }

    public void push(int val) {
        if(stack.empty()||val < stackmin.peek()){
            stack.push(val);
            stackmin.push(val);
        }
        else{
            stack.push(val);
            stackmin.push(stackmin.peek());
        }
    }

    public void pop() {
        stack.pop();
        stackmin.pop();
    }

    public int top() {
        return stack.peek();
    }

    public int getMin() {
        return stackmin.peek();
    }
}

3.小结

今天的分享到这里就结束了,喜欢的小伙伴不要忘记点点赞点个关注,你的鼓励就是对我最大的支持,加油!

相关推荐
皓木.5 分钟前
苍穹外卖——准备工作
java·数据库·mybatis
愤怒的代码18 分钟前
Spring Boot对访问密钥加密解密——RSA
java·spring boot·后端
美美的海顿19 分钟前
springboot基于Java的校园导航微信小程序的设计与实现
java·数据库·spring boot·后端·spring·微信小程序·毕业设计
愤怒的代码21 分钟前
Spring Boot中幂等性的应用
java·spring boot·后端
silver68722 分钟前
JAVA8 Stream API 使用详解
java
武子康25 分钟前
大数据-259 离线数仓 - Griffin架构 修改配置 pom.xml sparkProperties 编译启动
xml·java·大数据·hive·hadoop·架构
IT 古月方源35 分钟前
ensp 关于ARRP 的讲解 配置
运维·开发语言·网络·tcp/ip·智能路由器
三万棵雪松36 分钟前
1.系统学习-线性回归
算法·机器学习·回归·线性回归·监督学习
西猫雷婶41 分钟前
python学opencv|读取图像(二十二)使用cv2.polylines()绘制多边形
开发语言·python·opencv
温轻舟43 分钟前
前端开发 -- 自定义鼠标指针样式
开发语言·前端·javascript·css·html·温轻舟