栈的使用、模拟实现、相关经典算法题详细解析

直击高频编程考点:栈知识及经典算法题总结 栈与队列知识及编程练习总结:背景知识+栈的应用+相关编程练习(有效的括号+最小栈+每日温度+用栈实现队列+用队列实现栈+接雨水+逆波兰表达式求值+基本计算器+简化路径+岛屿数量+用数组实现一个栈+基本数学运算表达式求值+IP 范围判断) 阅读详情

前言❤️❤️

hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
这篇博客来解析栈的使用,栈也是Java里面非常重要的一个数据结构,在算法题中会经常用到,通常在学习完顺序表和链表来学习栈
栈的功能很单一,主要就三个操作,所以学起来会比链表简单一些;当然,对于一些算法题目也需要画图进行分析
这个专栏的数据结构是代码都是用Java来写的,JavaSE专栏现在已经全部更新完成,铁汁们复习基础知识时非常推荐使用,可以试一下💪💪💪
在这里插入图片描述
🎇个人主页:洋不写bug的博客
🎇所属专栏:数据结构专栏
🎇复习Java基础知识:Java学习之旅,从入门到进阶
🎇铁汁们对于数据结构基础的各种核心知识(不太常用的也有😆),都可以在上面的数据结构专栏学习,专栏正在持续更新中🐵🐵,有问题可以写在评论区或者私信我哦~

1,栈的简介

栈是顺序表和链表来实现的,只不过加了一些限制

栈是一种特殊的线性表,只允许在固定的一段插入和删除元素,就好像一个书箱,书一本一本放进去,最后放的书在最上面,要想拿到底部的书,就要把压在其上面的书都拿出来

在这里插入图片描述

栈禁止了顺序表/链表的各种增删改查操作,只支持三个操作:入栈,出栈,取栈顶元素,可以把栈看作只支持尾删、尾插,获取尾部元素的顺序表/链表



那既然已经有了链表/顺序表,功能那么全面,为什么还要发明栈呢?

在编程中,“灵活”是贬义词,”呆板“是褒义词,一个东西越灵活,就越容易出错(例如C语言中的指针),顺序表和链表的功能很丰富,就比较灵活
栈就是针对特定的场景,对顺序表的功能做出限制,从而大大降低了出错的概率

2,栈的使用

标准库中栈的集合类是Stack,入栈就使用push方法,出栈就使用pop方法,pop方法会返回出栈的元素(最后入栈的元素在栈顶,出栈时先出)

import java.util.Stack;

public class Test {
    public static void main(String[] args) {
        Stack<String> stack = new Stack<>();
        stack.push("aaa");
        stack.push("bbb");
        stack.push("ccc");

        String s = stack.pop();
        System.out.println(s);
        s = stack.pop();
        System.out.println(s);
        s = stack.pop();
        System.out.println(s);
    }
}

在这里插入图片描述


如果栈为空,使用pop进行出栈,就会报出“EmptyStackException”(空栈异常)

import java.util.Stack;

public class Test {
    public static void main(String[] args) {
        Stack<String> stack = new Stack<>();
        String s = stack.pop();
        System.out.println(s);
    }
}

在这里插入图片描述


peek方法是获取栈顶元素,元素不出栈,如果对于空栈使用peek方法,同样会报出“空栈异常”

import java.util.Stack;

public class Test {
    public static void main(String[] args) {
        Stack<String> stack = new Stack<>();
        String s = stack.peek();
        System.out.println(s);
    }
}

在这里插入图片描述



栈还有个size()方法,统计栈中元素的长度,还有个empty()方法,判断栈是否为空

import java.util.Stack;

public class Test {
    public static void main(String[] args) {
        Stack<String> stack = new Stack<>();
        stack.push("aaa");
        stack.push("bbb");
        stack.push("ccc");
        System.out.println(stack.size());
        System.out.println(stack.empty());
    }
}

在这里插入图片描述



栈可以改变元素的序列,下面这个题目,让判断不可能的出栈序列,可以画个图分析下(熟练就不用画了)

在这里插入图片描述

答案就是C,如下图,把3取出来之后,因为之前没有取2,那2一定是压在1的上面的,是不可能在不取2的情况下把1取出来的

在这里插入图片描述

3,栈的模拟实现

栈的模拟实现很简单,用数组来保存元素,搞个size变量,统计当前栈中的元素个数,这里我们就模拟实现个存储元素类型为String的栈

使用无参构造方法默认数组的长度就是1000,也可以使用有参来指定数组长度,再写个resize方法,进行扩容操作

public class MyStack {
    private String[] arr;
    private int size;

    public MyStack() {
        arr = new String[1000];
        size = 0;
    }

    public MyStack(int capacity) {
        arr = new String[capacity];
        size = 0;
    }
    
    public void resize(){
        String[] newArr = new String[size * 2];
        for(int i = 0;i < size;i++){
            newArr[i] = arr[i];
        }
        arr = newArr;
    }
}



进行入栈操作时判断下数组有没有满,如果满了就进行扩容操作,接着把元素存到数组中即可

    public void push(String val){
        if(size == arr.length){
            resize();
        }
        arr[size] = val;
        size++;
    }



重写个toString方法,接着在main方法中测试一下

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for(int i = 0;i < size;i++){
            stringBuilder.append(arr[i]);
            if(i < size - 1){
                stringBuilder.append(",");
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }
public class Test {
    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push("aaa");
        myStack.push("bbb");
        myStack.push("ccc");
        System.out.println(myStack);
    }
}

在这里插入图片描述


pop方法和peek方法要先判断下数组中有没有元素(也就是栈是否为空),不为空就取出元素,pop方法多加了个size–

    public String pop(){
        if(size == 0){
            throw new RuntimeException("Stack is empty!");
        }
        String elem = arr[size - 1];
        size--;
        return elem;
    }


    public String peek(){
        if(size == 0){
            throw new RuntimeException("Stack is empty!");
        }
        String elem = arr[size - 1];
        return elem;
    }



empty方法就判断个size是否等于0即可

    public boolean empty(){
        return size == 0;
    }



这里聊个题外话,入栈4个元素,接着pop五次,最后一次就会报错,但是铁汁们在IDEA中运行几次就会发现,报错信息有时候在上面,有时候在下面,这是怎么回事呢?

public class Test {
    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push("aaa");
        myStack.push("bbb");
        myStack.push("ccc");
        myStack.push("ddd");
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
        System.out.println(myStack.pop());
    }
}

在这里插入图片描述

在这里插入图片描述

打印元素是System.out.println,打印错误是System.error.println,这两个东西都是在控制台上打印的,但并不在一个通道中,不同通道代码的执行速度是不一样的,所以不一定先执行System.out.println了,就一定先打印元素🐵

4,逆序打印链表

如果想要逆序的打印一个链表,之前的解法是把链表反转一下,学习栈之后,就可以直接顺序遍历链表,把链表存储到栈中,再一 一出栈,就能得到逆序的打印

public class Node {
    public String val;
    public Node next;

    public Node(String val) {
        this.val = val;
        this.next = null;
    }
}
import java.util.Stack;

public class Test {

    public static void reversePrint(Node head){
        Node cur = head;
        Stack<String> stack = new Stack<>();
        while(cur!= null){
            stack.push(cur.val);
            cur = cur.next;
        }
        while (!stack.empty()){
            System.out.println(stack.pop());
        }
    }


    public static void main(String[] args) {
        Node a = new Node("a");
        Node b = new Node("b");
        Node c = new Node("c");
        Node d = new Node("d");
        a.next = b;
        b.next = c;
        c.next = d;
        d.next = null;
        reversePrint(a);
    }
}



链表逆序打印,还可以使用递归,递归写法特别简单,但是很不好理解,出错了也不好分析,因此还是尽量用非递归的写法

    public static void reversePrint(Node head) {
        if (head == null) {
            return;
        }
        reversePrint(head.next);
        System.out.println(head.val);
    }

递归调用图如下

在这里插入图片描述

5,有效的括号

在这里插入图片描述
力扣链接

有效字符串中的左括号必须与右括号相匹配,示例5,s = “([)]”,字符串是无效的;括号是可以嵌套的,示例4,s = “([])”,字符串是有效的



这个题目使用栈就很好解决

  • 创建一个栈,遍历字符串中的每个字符,如果是左括号,就放到栈中,如果是右括号,就取出栈顶的括号进行配对(如果这时候栈为空,说明是左括号是少的,就返回false)
  • 配对不上就返回false,能配对的上,就继续遍历字符串,直到字符串遍历完,栈为空了(左括号和右括号的数量不一定相同),就说明字符串是有效的
class Solution {
    public boolean isValid(String ss) {
        Stack<Character> stack = new Stack<>();
        char[] s = ss.toCharArray();
        for(char ch : s){
            if(ch == '[' || ch == '{' || ch == '('){
                stack.push(ch);
                continue;
            }
            if(ch == ']' || ch == '}' || ch == ')'){
                if(stack.empty()){
                    return false;
                }
                char top = stack.pop();
                if(top == '{' && ch == '}'){
                    continue;
                }
                if(top == '[' && ch == ']'){
                    continue;
                }
                if(top == '(' && ch == ')'){
                    continue;
                }
                return false;
            }
        }
        if(stack.empty()){
            return true;
        }else{
            return false;
        }
    }

6,逆波兰表达式求值

在这里插入图片描述
力扣链接

逆波兰表达式就是一种后缀表达式(运算符放在后面)

我们平常使用的算式就是中缀表达式,例如(1 + 2) * (3 + 4)

用后缀表达式来写,就是((1 2 +)(3 4 +) * )

逆波兰表达式就是把括号去掉,1 2 + 3 4 + *,也可以根据次序算出正确的结果,逆波兰适合用栈进行运算

创建一个栈,从前往后遍历表达式,如果是数字,就放入栈中,如果是运算符,就从栈中出栈两个元素,进行计算,计算后再放回栈中,这样最后就能按次序算出正确的结果,流程图如下所示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


写代码时有一些点需要注意:

  1. 输入是一个字符串数组,计算时要把字符串通过Integer.parseInt转为数字,计算出的结果是int类型,还需要跟空字符串拼接,转为String类型
  2. 因为是字符串,所以不能用ASCII码值来判断读取到的是数字还是运算符,需要额外写个isNumber方法,来进行判断
  3. 读取到运算符后,需要一 一比对是哪个运算符,接着从栈中取出两个元素,如果是减法和除法,注意是后取出的元素减去/除以先取出的元素,顺序不要搞反了
class Solution {
    public int evalRPN(String[] tokens) {
        Stack<String> stack = new Stack<>();
        for(String s : tokens){
            if(isNumber(s)){
                stack.push(s);
            }else{
                int num1 = Integer.parseInt(stack.pop());
                int num2 = Integer.parseInt(stack.pop());
                int result = 0;
                if(s.equals("+")){
                    result = num2 + num1;
                    stack.push("" + result);
                }
                if(s.equals("-")){
                    result = num2 - num1;
                    stack.push("" + result);
                }
                if(s.equals("*")){
                    result = num2 * num1;
                    stack.push("" + result);
                }
                if(s.equals("/")){
                    result = num2 / num1;
                    stack.push("" + result);
                }
            }
        }
       return Integer.parseInt(stack.pop());
    }

    public boolean isNumber(String s){
        if(!s.equals("-") && !s.equals("+") && !s.equals("*") && !s.equals("/")){
            return true;
        }
        return false;
    }
}

7,栈的压入,弹出序列

在这里插入图片描述
牛客链接

这个题目要判断按照第一个序列的顺序压入,第二个序列是否可能是弹出序列,题目中的pushV和popV是C++中的写法,这里改为pushA和popA

在这里插入图片描述


可以这样来搞,创建一个栈,每个序列再搞一个引用

在这里插入图片描述



遍历pushA,把每个元素依次入栈,每次入栈一个元素,都进行如下判定:

  1. 首先判断链表是否为空
  2. 如果不为空,再判定栈顶元素是否等与popA的当前元素,如果相等,元素出栈,popIndex右移一步,再重新回到第一步这里继续循环处理
  3. 如果判定链表为空或者栈顶元素不等于popA的当前元素,那就pushIndex继续向右移动,pushA中的元素继续入栈



铁汁们可以画图模拟下这个过程(单靠描述可能有点抽象),最后pushA遍历完毕后,如果栈为空,就说明都能匹配的上,返回true,否则就返回false

在这里插入图片描述


分析清楚后,代码写起来还是比较简单的

import java.util.*;


public class Solution {
    public boolean IsPopOrder (int[] pushA, int[] popA) {
        Stack<Integer> stack = new Stack<>();
        int pushIndex = 0;
        int popIndex = 0;
        for(int i = 0;i < pushA.length;i++){
            stack.push(pushA[i]);
            while(!stack.empty()){
                if(popA[popIndex] == stack.peek()){
                    stack.pop();
                    popIndex++;
                }else{
                    break;
                }
            }
        }

        return stack.empty();
    }
}

8,最小栈

在这里插入图片描述

力扣链接

这个题目是可以在MinStack类中使用栈的,如果用数组进行底层模拟的话,就比较麻烦了😅

重点是getMin()方法,因为元素pop后,最小元素是可能会改变的,所以搞一个min变量来记录当前元素的最小值是不可行的

创建一个stack1,再额外创建一个stack2,在stack2的栈顶中保存stack1中的最小值,如下图,先把9放入stack1中,这时候stack1中的最小值就是9,在stack2中加入9;接着把5放到stack1中,stack1的最小值就是5,把5放到stack2中

在这里插入图片描述
在这里插入图片描述



接下来把2放在stack1中,这时候stack1的最小值为2,把2放到stack2中,后续添加元素时,stack1中的最小值都是2,每次都把2加入到stack2中

在这里插入图片描述



这样后续stack1元素出栈时,stack2的元素也出栈,就能保证stack2栈顶的元素一定是stack1中的最小值,getMin方法直接取出stack2的栈顶元素即可

class MinStack {
    private Stack<Integer> stack1 = new Stack<>();
    private Stack<Integer> stack2 = new Stack<>();
    public MinStack() {
        
    }
    
    public void push(int value) {
        stack1.push(value);
        if(stack2.empty()){
            stack2.push(value);
            return;
        }
        int min = stack2.peek();
        if(value < min){
            stack2.push(value);
        }else{
            stack2.push(min);
        }

    }
    
    public void pop() {
        stack1.pop();
        stack2.pop();
    }
    
    public int top() {
        return stack1.peek();
    }
    
    public int getMin() {
        return stack2.peek();
    }
}

结语

  • 栈是数据结构学习路上非常基础却至关重要的一环,栈的使用挺简单的,主要就三个操作:出栈、入栈、获取栈顶元素,后续很多复杂算法,例如深度优先搜索、函数调用栈等底层原理都离不开它
  • 下篇博客会解析队列,队列和栈一样,也是基于顺序表和链表来实现的,也是加了一些限制



以上就是今天的所有内容啦~完结撒花~🥳🎉🎉

在这里插入图片描述

leetcode刷题(javaScript)——栈、单调栈相关场景题总结 栈的主要思想是“后进先出”(Last In First Out,LIFO),即最后进入栈的元素最先出栈。栈通常用于解决需要“回溯”或“撤销”操作的问题,以及需要维护“”的问题。给定一个只包括'('')''{''}''['']'的字符串s,判断字符串是否有效。主要思路是遇到左括号推入栈遇到右括号,将栈顶左括号移除,并和它进行对比。不相等return false否则继续比较,直到最后,判断是否还有没匹配上的左括号。 阅读详情

相关推荐

【无人机智能避障】基于深度强化学习的城市复杂环境路径规划实战

本文探讨了基于深度强化学习的无人机在城市复杂环境中的智能避障与路径规划。针对传统算法难以应对动态与非结构化障碍的痛点,文章详细介绍了如何利用DQN算法,通过设计合理的状态空间、奖励函数,并结合经验回放、目标网络等技巧,训练无人机自主学会在楼宇间安全、高效飞行的策略。

weixin_28224217的博客 733

【Java 数据结构】栈的实现及相关OJ题

栈是一种数据结构,是操作受限制的线性表(先进后出),它只能在固定的一端进行插入和删除操作,进行数据插入和删除的一端为栈顶,另一端为栈底,按存储方式分为。

书生-w的博客 1万+

AI应用安全 - Prompt注入攻击

随着大模型的爆火,各行各业都在使用大模型进行智能化改造。但是如何做一个可靠的大模型应用,就需要考虑各种安全问题。本文主要介绍一种常见的安全问题,即prompt注入攻击,并介绍一些防范手段。Prompt Injection Attack(提示注入攻击)是针对大型语言模型(LLM)的一种新兴安全威胁,攻击者通过精心构造的输入提示(prompt)来操纵模型行为,使其产生非预期输出或执行恶意操作。它主要包括两种注入方式,一是直接注入,而是间接注入。

sinat_28694519的博客 1932

面试中考察栈和队列的经典算法题

通过以上对栈和队列面试常见题目的分析与解答,希望能帮助你更好地理解和掌握这两种数据结构在面试中的应用,提高你在数据结构方面的解题能力和应对面试的信心。在实际准备面试过程中,建议你多做练习,深入理解每种数据结构的特点和操作方法,以便能够灵活运用它们解决各种问题。如果你还有其他问题或需要进一步的解释,欢迎随时提问。

A Charmer 的博客 1784

GitHub与GitLab中的Fork操作:从个人仓库到团队协作的完整指南

本文详细介绍了GitHub与GitLab中的Fork操作,从个人仓库到团队协作的完整指南。通过Fork操作,开发者可以在权限隔离的环境下自由实验,并通过合并请求机制保证代码质量。文章涵盖了Fork的具体步骤、本地开发环境配置、代码同步方法以及高级协作技巧,帮助团队高效管理代码仓库。

weixin_28829325的博客 306

[UE5蓝图基础二]1.[1d混合空间] 走和跑的动画切换(shift切换)

再双击”run”进去 我们需要给他指定一个动画姿势,这里就需要给他我们前面做的”1d”混合空间,然后可以看到”1d” 上有个speed参数,代表的速度 从前面的逻辑来看需要通过控制速度来切换动画,那么必然不能写死速度,把速度提升为变量传递进来即可,所以就得到以下蓝图节点。混合空间的概念:混合空间就是可以将角色多个动画混合在一起 ,我们创建动画类就是创建个”Animation”文件夹 在文件夹内创建混合空间。我们目前要实现的是一个走和跑的功能 那么创建1d即可。到这一步混合空间已经做完 下一步做”动画蓝图”

qq_30584617的博客 3299

数据结构C语言篇《三》栈和队列概念,模拟函数实现,以及相关OJ面试题

#pragma once typedef int DataType; typedef struct Stcak { DataType *arr; int capacity; //容量大小 int size; //有效元素个数---栈顶 }Stack; //栈的初始化 void StackInit(Stack *ps); //入栈 void StackPush(Stack *ps, DataType data); //出栈 void StackPop(Stack *ps); //获取栈顶元

愿你有青春亦可奔赴 1431

Android Camera性能优化概述

做camera性能优化方面的工作有几年了,想写一篇文章简单介绍一下其中涉及到的具体技术,这篇文章会大概介绍一下涉及到的技术。

weixin_42136255的博客 4023

【数据结构】关于栈的经典算法题

数据结构算法题逆波兰求值,括号匹配,栈的压入与弹出序列

weixin_53106294的博客 1475

基于 openEuler 24.03 LTS 源码编译安装 Zabbix 7.4

Zabbix是一款开源的企业级分布式监控系统,支持网络、服务器、应用等多种IT资源的监控。核心功能包括数据采集、告警通知、可视化展示等,采用Server/Agent架构,支持多种操作系统。本文详细介绍了在openEuler 24.03系统上部署Zabbix 7.4.2的完整流程,包括环境准备、MySQL配置、PHP/Apache安装、Zabbix编译安装等步骤,为构建企业级监控系统提供了实践指导。

广然笔记 1190

基于多智能体的自动化公司调研系统

在当今竞争激烈的商业世界中,了解公司的详细信息对于投资者、合作伙伴和研究机构等具有重要意义。传统的公司调研方式往往需要耗费大量的人力、物力和时间,且容易出现信息不全面、不准确等问题。基于多智能体的自动化公司调研系统的目的是利用多智能体技术,实现公司调研的自动化和智能化,提高调研的效率和准确性。本系统的范围涵盖了公司基本信息收集、市场竞争力分析、财务状况评估等多个方面。本文将按照以下结构进行组织:首先介绍系统的核心概念和相关联系,包括多智能体系统的原理和架构;

架构师的AI之路,分享AI应用开发架构的学习与实践。 964

【C++算法】栈相关经典算法题

这个题目很有乐趣,解决这道题目我们对这个字符串要纵向看它,此时如果相邻的字符相同,比如我们上面的[b]和[b],我们就可以把它消灭,然后这两个被消除的字符的上面字符[a]往下掉落,然后这个字符又有相邻相同的字符[a],我们又可以它消灭,很像我们玩过的开心消消乐游戏,只不过我们这里的是两个字符相同就满足消消乐,回归本题,既然要纵向看它,此时我们的数据结构就只有栈符合这个条件,当前元素是否被消除,需要知道上⼀个元素的信息,可以⽤栈来保存信息。自然是遇到一个元素等于当前的出栈序列的元素,那我们就让它出栈。

qq_64446981的博客 1081

【ArcGIS风暴】Win10操作系统ArcGIS许可License无法启动的解决方法汇总(绝对成功!)

文章目录1. 关闭Windows Defender2. 关闭系统防火墙3. 删除迈克菲(McAfee)杀毒软件4. 在系统服务中启动 在安装ArcGIS软件时,最重要的一步是许可服务的正常启动,通常,由于各种各样的原因,ArcGIS许可管理器License Manager十有八九会无法启动,点N多次都没反应,如果许可服务不能如愿启动的话,即使Desktop安装成功,也是无法打开的。本文汇总了Win10操作系统之上ArcGIS安装过程中可能会导致服务无法启动的原因及解决办法。 ArcGIS安装参考教程:

智慧空间实验室 2万+

栈和队列(超详细Java实现)

可以看到,先入栈的元素要等后入栈的元素出栈后才能出栈,栈中的元素总是遵循后进先出LIFO(Last In First Out)的原则。生活中的例子:JVM : Java虚拟机Java标准库中提供的栈 可以看到,Stack继承了Vector,Vector是动态的顺序表,与ArrayList类似,不同的是,Vector是线程安全的.实现的方法 输出结果: 2. 入栈(push) 3. 出栈(pop) 4.获取栈顶元素(peek) 5.获取元素个数(getSize) 6.判断栈是否为空(isEm

qq_57735833的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数据结构——栈的模拟实现

与顺序表和单链表不同的是:顺序表和单链表都可以在头部和尾部插入和删除数据,但是栈的结构就锁死了(栈的底部是堵死的)栈只能从栈顶插入(数据入栈)和删除(数据出栈)数据————last in first out(后进先出)(最后入栈的数据要第一个出栈如果进栈过程中不允许出栈:入栈 1 2 3 4————出栈4 3 2 1。

2403_88695928的博客 1272

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

有关栈的经典算法题

k[encoded_string],把括号内字符串重复k次,支持嵌套,例如3[a2[bc]]→abcbcabcbcabcbc。覆盖基础栈、单调栈、辅助栈、括号匹配、表达式求值、栈模拟队列、区间最值等面试高频题型,每题包含题意、思路、完整代码。栈核心特性:后进先出LIFO,常用场景:括号校验、递归转迭代、单调性维护、临时缓存。遇右括号,栈顶匹配则出栈,不匹配直接false;设计栈,支持push、pop、top,额外O(1)获取栈中最小元素。栈顶和当前字符相等则出栈,否则入栈,最后拼接栈内字符。

weixin_43715864的博客 345

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

栈和队列使用及模拟实现

stack,queue,deque相关内容介绍

qq_55958734的博客 1009

【数据结构】栈和队列的模拟实现(两个方式实现)

这一篇博客将学习栈和队列的相关知识,栈和队列是两种基础的数据结构,在现在一定要打好基础,在之后的学习生涯中,也常常遇见,例如:深度优先搜索(DFS)广度优先搜索(BFS)……今天要学习栈和队列的模拟实现:用数组模拟实现栈,用单链表模拟实现队列,用数组模拟实现队列。

加油,考上985的研究生 1850

与队列和栈相关的【OJ题】

队列实现栈,栈实现队列,循环队列

SWsunlight的博客 1041

【算法】栈与模拟

栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底,栈中的数据元素遵守后进先出的原则。它的插入操作叫做进栈(或进栈/入栈),插入的数据在栈顶;删除操作叫做出栈。出的数据也在栈顶。栈一般与模拟算法结合在一起出题,在题目中野经常充当数据的缓存容器,来帮助模拟入栈和出栈的过程以求得结果。

NeeEk0的博客 988

JAVA 数组简单模拟栈的相关实现(入栈、出栈、遍历)详细实例验证

使用数组模拟栈的操作思路: 使用数组来模拟栈步骤分析: 1. 定义一个变量top表示栈顶,并初始化为 -1 3. 入栈操作,当有数据加入到栈时, top++; stack[top] = data; 4. 出栈操作,先将栈顶的元素保存到一个变量中,然后再移动top变量,则int value = stack[top]; top--; return value; 代码实现: 1、创建数组对象ArrayStack.class 1)构造方法,传入栈的最大容量 private i...

Sundy_sc的专栏 1129

用栈模拟实现队列(c语言版)

力扣题:用栈实现队列(c语言版)

@初阶牛的博客 1427

【C语言实现:用队列模拟栈与用栈模拟队列(LeetCode 225 & 232)】

栈栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶实现方法:1. 数组(顺序表) 2.链表队列队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)入队列。

iiiiiankor的博客 1051

力扣第232题“用栈实现队列”

本文详细解读了力扣第232题“用栈实现队列”,通过使用两个栈的方法高效地解决了这一问题,并提供了详细的解释和模拟面试问答。希望读者通过本文的学习,能够在力扣刷题的过程中更加得心应手。

10年数据\经营分析经验,现任大厂数据分析负责人 1124

栈的模拟实现

对于栈的实现不仅仅顺序结构可以满足,链表结构也可以实现但是时间复杂度有作为前提所以用顺序结构较为方便便利。栈的功能结构不像顺序表那样复杂所以栈的实现相对于前面的链表结构和顺序结构相对于好实现,且顺序结构和链表结构较为基础。

2401_85540120的博客 1123

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 187
上一篇: 链表面试笔试经典题目详细解析,题目多解法,复杂度分析
下一篇: 队列的使用,基于数组和基于链表的模拟实现,题目练习
洋不写bug
博客等级 码龄2年 87粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值