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

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

相关推荐
geats人山人海4 小时前
算法好题 2026.7.18
算法
Darkwanderor4 小时前
动、静态库相关内容的详细介绍
linux·c语言·开发语言·c++
文祐4 小时前
C++类之虚函数表没有虚继承的菱形继承
开发语言·c++·算法
Lumos1864 小时前
51单片机从零到实战(8)——串口通信
算法
倒流时光三十年4 小时前
Logback 系列(7):常用 Appender(控制台 / 文件 / 滚动文件)
java·前端·logback
sycmancia4 小时前
Qt——另一种创建线程的方式
开发语言·qt
极客先躯4 小时前
高级java每日一道面试题-2026年04月18日-实战篇[Docker]-如何处理金融行业的时序数据容器化?
java·运维·docker·容器·金融·时序数据·高级面试
hdsoft_huge5 小时前
SpringBoot系列18:SpringSecurity登录鉴权,JWT无状态Token认证完整流程(生产级落地)
java·spring boot·后端
野蛮人6号5 小时前
黑马天机学堂系列问题之选集8本地服务报错
java·spring cloud·黑马程序员·天机学堂·黑马天机学堂
小帽子_1235 小时前
大功率 PCS 双环闭环控制算法原理与实现
算法