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.小结

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

相关推荐
《源码好优多》28 分钟前
基于Java Springboot出租车管理网站
java·开发语言·spring boot
清流君29 分钟前
【运动规划】移动机器人运动规划与轨迹优化全解析 | 经典算法总结
人工智能·笔记·算法·机器人·自动驾驶·运动规划
wang_changyue29 分钟前
CSP-X2024解题报告(T3)
数据结构·算法·leetcode
因特麦克斯29 分钟前
每日一题&移动语义
算法
vir0235 分钟前
木材加工(二分查找)
数据结构·c++·算法
余辉zmh2 小时前
【c++篇】:深入c++的set和map容器--掌握提升编程效率的利器
开发语言·c++
·云扬·4 小时前
Java IO 与 BIO、NIO、AIO 详解
java·开发语言·笔记·学习·nio·1024程序员节
Tisfy5 小时前
LeetCode 3240.最少翻转次数使二进制矩阵回文 II:分类讨论
算法·leetcode·矩阵·题解·回文·分类讨论
求积分不加C5 小时前
Spring Boot中使用AOP和反射机制设计一个的幂等注解(两种持久化模式),简单易懂教程
java·spring boot·后端
枫叶_v5 小时前
【SpringBoot】26 实体映射工具(MapStruct)
java·spring boot·后端