栈

栈区数据被飞踩问题定位手段 1、栈溢出或者栈数据被踩时,继续运行就会出现segmentation fault。可以尝试着接管SIGSEGV信号,在信号处理函数中保存一些出现异常时候的信息。 2、基于栈溢出场景,栈空间被破坏,也就没法使用栈区,当然就没法执行SIGSEGV信号的处理函数。因此需要开辟额外的空间用于栈空间使用,系统提供了sigaltstack接口。 2.1、开辟第二栈区的代码 void create_alt_stack(void) { stack_t sigstack; memset(&sigsta 阅读详情

栈是一种操作受限的线性表,只允许在一端插入和删除数据。

 

栈的实现:

栈,即可以用数组来实现,也可以用链表来实现,使用数组来实现的栈叫顺序栈,使用链表来实现的栈叫链式栈。

 

这是基于java语言来分别实现的顺序栈和链式栈.

 

顺序栈

 

/**

 * 用数组实现一个顺序栈

 *

 * <p>栈,先进后出,后进的先出

 *

 * @author liujun

 * @version 0.0.1

 * @date 2019/08/07

 */

  public class MyArrayStack {

  

  private final int[] stackArray;

  

  /** 限制栈的大小 */

  private final int maxStackSize;

  

  /** 当前栈的大小 */

  private int currSize = -1;

  /**

   * 进行栈的初始化操作

   *

   * @param stackSize

   */

  public MyArrayStack(int stackSize) {

    this.maxStackSize = stackSize;

    this.stackArray = new int[stackSize];

  }

  

  /**

   * 栈中放入一个数

   *

   * @param value

   */

  public void push(int value) {

    if (currSize + 1 > maxStackSize) {

      throw new IndexOutOfBoundsException("index out of bounds ");

    }

  

    stackArray[++currSize] = value;

  }

  

  /**

   * 获取当前栈的大小

   *

   * @return

   */

  public int size() {

    return currSize + 1;

  }

  

  /**

   * 从栈中取出一个元素

   *

   * @return 取出的栈顶的元素

   */

  public int pop() {

  

    if (currSize < 0) {

      throw new NegativeArraySizeException("index is less than 0 ");

    }

  

    int getValue = stackArray[currSize];

    stackArray[currSize] = -1;

    currSize--;

  

    return getValue;

  }

}

 

链式栈

/**

 * 使用链表实现链式栈

 *

 * @author liujun

 * @version 0.0.1

 * @date 2019/08/14

 */

  public class MyLinkedStack {

  

  class Node {

  

    private int val;

  

    private Node next;

  

    public Node(int val) {

      this.val = val;

    }

  }

  

  private Node root = new Node(-1);

  

  /** 最大的链式栈大小 */

  private final int maxSize;

  

  /** 当前大小 */

  private int size;

  

  public MyLinkedStack(int maxSize) {

    this.maxSize = maxSize;

    this.size = 0;

  }

  

  /**

   * 插入数据到栈顶

   *

   * @param value

   */

  public void push(int value) {

    if (size > maxSize) {

      throw new IndexOutOfBoundsException("exceed the limit");

    }

    // 1,获得原来链表的下级节点

    Node nextTmp = root.next;

  

    Node currTmpNode = new Node(value);

    root.next = currTmpNode;

    currTmpNode.next = nextTmp;

  

    size++;

  }

  

  public boolean full() {

    return size == maxSize;

  }

  

  // 获取当前链式栈的大小

  public int size() {

    return size;

  }

  

  /**

   * 实现弹出栈顶操作

   *

   * @return

   */

  public int pop() {

    if (size < 1) {

      throw new NullPointerException("stack is null");

    }

  

    // 1,找到栈顶元素

    Node tmpNode = root.next;

  

    if (tmpNode == null) {

      return -1;

    }

  

    // 找到下级元素

    Node nextValue = null;

    nextValue = tmpNode.next;

  

    int value = tmpNode.val;

    root.next = nextValue;

  

    size--;

  

    return value;

  }

}

 

 

 

栈的应用:

括号的有效性判断:

 

leetcode题目:

Given a string containing just the characters '(', ')', '{', '}', '[' and ']',

 determine if the input string is valid.



An input string is valid if:



Open brackets must be closed by the same type of brackets.

Open brackets must be closed in the correct order.

Note that an empty string is also considered valid.



Example 1:



Input: "()"

Output: true

Example 2:



Input: "()[]{}"

Output: true

Example 3:



Input: "(]"

Output: false

Example 4:



Input: "([)]"

Output: false

Example 5:



Input: "{[]}"

Output: true

 

 

检查括号输入括号是否有效,包括”{”, ”}” , ”[” , ”]” , ”(” , ”)”,检查需要支持括号嵌套。

 

我的代码实现


  /**

 * 解决方案

 *

 * <p>通过定义枚举进行括号的配对操作

 *

 * @author liujun

 * @version 0.0.1

 * @date 2018/11/17

 */

  public class Solution {

  

  public enum BracketEnum {

    /** 小括号 */

    PARENTHESES('(', ')'),

    /** 中括号 */

    BRACKETS('[', ']'),

    /** 大括号 */

    CURLYBRACES('{', '}');

  

    private char left;

    private char right;

  

    BracketEnum(char left, char right) {

      this.left = left;

      this.right = right;

    }

  

    public static boolean left(char val) {

      for (BracketEnum item : values()) {

        if (item.left == val) {

          return true;

        }

      }

      return false;

    }

  

    public static BracketEnum right(char val) {

      for (BracketEnum item : values()) {

        if (item.right == val) {

          return item;

        }

      }

      return null;

    }

  }

  

  public boolean isValid(String s) {

    if (null == s) {

      return false;

    }

    if (s.length() == 0) {

      return true;

    }

  

    char[] braket = s.toCharArray();

    Stack<Character> leftStack = new Stack();

    BracketEnum bracket = null;

  

    for (int i = 0; i < braket.length; i++) {

      // 如果为左括号压入左括号左括号栈中

      if (BracketEnum.left(braket[i])) {

        leftStack.push(braket[i]);

      } else {

        // 如果为右括号,则从左侧栈中弹出一个做比较,一至则不放入

        if ((bracket = BracketEnum.right(braket[i])) != null) {

          if (!leftStack.isEmpty()) {

            char left = leftStack.pop();

            if (left != bracket.left) {

              return false;

            }

          } else {

            return false;

          }

        }

      }

    }

  

    return leftStack.isEmpty();

  }

}

 

 

 

进行分解成示意图就是图中这个操作流程.

 

 

这样看起来非常的简单,在遇到左括号时,进行压栈操作,在遇到右括号时进行出栈操作。

当发生一个括号不能匹配时,则可以直接返回校验失败,当所有的括号都遍历完成后,如果栈为空,说明匹配成功,否则匹配失败。接下来详细说明下整个过程以”{[()]}”为例

  1. 在遇到”{”括号了,进行压栈操作。就像1中所示.
  2. 接下来是”[”括号,也是左括号,进行压栈操作。如2所示
  3. 在接下来遍历的是”(”,同样是左括号,也同样进行压栈操作。如3
  4. 接下来遇到的是”)”,此时是右括号,将从栈顶元素同当前括号进行配对,“()”正好配对成功,将”(”出栈。如4
  5. 再接下来是”]”,此时也是右括号,将同栈顶元素进行配对操作。“[]”也可以匹配成功。将”[”出栈。如5
  6. 再接下来就是最后一个字符”}”,与栈顶元素”{”,可以配对成功,将”{”出栈。如6所示。

当遍历完成后,栈已经为空,说明配对成功。

 

 

针对这个来说,还有更优的解法。此参考了leetcode上其他人的实现。

/**

 * 解决办法

 *

 * <p>使用数组来实现栈的功能

 *

 * @author liujun

 * @version 0.0.1

 * @date 2018/11/17

 */

  public class SolutionArrayStackOther {

  

  public boolean isValid(String s) {

    if (null == s) {

      return false;

    }

  

    if (s.length() == 0) {

      return true;

    }

  

    char[] stack = new char[s.length()];

    int stackIndex = -1;

  

    char data;

    int readIndex = 0;

  

    while (readIndex < s.length()) {

      data = s.charAt(readIndex);

      

      if (data == ' ') {

        readIndex++;

        continue;

      }

  

      if (data == '(' || data == '{' || data == '[') {

        stack[++stackIndex] = data;

      } else if (data == ')' || data == '}' || data == ']') {

        if (stackIndex >= 0

            && ((stack[stackIndex] == '(' && data == ')')

                || (stack[stackIndex] == '{' && data == '}')

                || (stack[stackIndex] == '[' && data == ']'))) {

          stackIndex--;

        } else {

          return false;

        }

      }

  

      readIndex++;

    }

  

    return stackIndex == -1;

  }

}

 

 

 

表达式的求值:

Leetcode227:

227 basic calculator 2



Implement a basic calculator to evaluate a simple expression string.



The expression string contains only non-negative integers, +, -, *, / operators and empty spaces .

 The integer division should truncate toward zero.



Example 1:



Input: "3+2*2"

Output: 7

Example 2:



Input: " 3/2 "

Output: 1

Example 3:



Input: " 3+5 / 2 "

Output: 5

Note:



You may assume that the given expression is always valid.

Do not use the eval built-in library function.

 

注:需要注意的是在乘除法的优先级比加减法要高,需要进行优先计算。

 

可以通过两个栈来实现一个保存数值的栈,一个保存操作数的栈。当遇到操作数时就进行压栈操作,

当遇到操作符时,就与栈顶元素作比较,如果比栈顶元素的优先级高。就将当前操作符压栈操作;如果比栈顶元素的优先级低,则弹出两个操作数与一个操作符进行运算。然后继续比较。

 

我的实现:


  /**

 * 一个简单的非负数的计算器的实现

 *

 * @author liujun

 * @version 0.0.1

 * @date 2019/08/16

 */

  public class SolutionCalculator {

  

  enum OperEnum {

    PLUS('+', 1),

    MINU('-', 1),

    MULT('*', 2),

    DIVI('/', 2),

    ;

    private char oper;

    private int order;

  

    public static OperEnum getOper(char item) {

      OperEnum oper = null;

      for (OperEnum operitem : values()) {

        if (operitem.oper == item) {

          oper = operitem;

        }

      }

  

      return oper;

    }

  

    OperEnum(char oper, int order) {

      this.oper = oper;

      this.order = order;

    }

  }

  

  public int calculate(String s) {

  

    if (s == null || s.isEmpty()) {

      return 0;

    }

  

    // 数值栈

    Stack<Integer> valueStack = new Stack<>();

    // 操作数栈

    Stack<Character> operStack = new Stack<>();

  

    int curIndex = 0;

    char charItem;

    while (curIndex < s.length()) {

      charItem = s.charAt(curIndex);

  

      if (charItem >= '0' && charItem <= '9') {

        int currValue = 0;

  

        //进行数字的提取,比较巧妙。利用的是位之前是10的倍数的关系,然后再加当前数。

        while (curIndex < s.length() && Character.isDigit(s.charAt(curIndex))) {

          currValue = currValue * 10 + (s.charAt(curIndex) - '0');

          curIndex++;

        }

        // 将操作数压栈操作

        valueStack.push(currValue);

  

        continue;

      } else if (charItem == OperEnum.PLUS.oper

          || charItem == OperEnum.MINU.oper

          || charItem == OperEnum.MULT.oper

          || charItem == OperEnum.DIVI.oper) {

  

        if (operStack.isEmpty()) {

          operStack.push(charItem);

        } else {

          OperEnum operLast = OperEnum.getOper(operStack.peek());

          OperEnum operCurr = OperEnum.getOper(charItem);

          //算法符的优先级比较

          if (operCurr.order > operLast.order) {

            operStack.push(charItem);

          } else {

            // 执行运算

            runCount(valueStack, operStack, operCurr);

            operStack.push(charItem);

          }

        }

      }

  

      curIndex++;

    }

  

    if (!operStack.isEmpty()) {

      runCount(valueStack, operStack, null);

    }

  

    return valueStack.pop();

  }

  

  /**

   * 进行栈中数据的计算操作

   * @param valueStack 数据栈

   * @param operStack 操作符栈

   * @param operCurr 当前操作符

   */

  private void runCount(Stack<Integer> valueStack, Stack<Character> operStack, OperEnum operCurr) {

    while (!operStack.isEmpty()) {

  

      //栈中的操作符优先级低于当前操作符优先级,则不运算。

      OperEnum lastStack = OperEnum.getOper(operStack.peek());

      if (null != operCurr && lastStack.order < operCurr.order) {

        break;

      }

  

      char currValue = operStack.pop();

      int value2 = valueStack.pop();

      int value1 = valueStack.pop();

  

      if (currValue == OperEnum.PLUS.oper) {

        valueStack.push(value1 + value2);

      } else if (currValue == OperEnum.MINU.oper) {

        valueStack.push(value1 - value2);

      } else if (currValue == OperEnum.MULT.oper) {

        valueStack.push(value1 * value2);

      } else if (currValue == OperEnum.DIVI.oper) {

        valueStack.push(value1 / value2);

      }

    }

  }

}

 

 

详细的运算流程:

以3+2*2/2+6为例

 

 

  1. 解析到数字将数字3,压入到数值栈中。
  2. 解析到操作符+,此时操作符栈为空,将当前操作符+直接压入到操作符栈中。
  3. 解析到数字2,将2压入到数值栈中。
  4. 解析到操作符*号,由于乘法的优先级高于加法,因此,将操作符*压入栈中。
  5. 解析到数字2,将2压入到数值栈中
  6. 解析到数字/号,由于除号的优先级与乘法相同,因此将弹出两个操作数“2”,“2”及一个操作符*号进行运算得到4,将结果4压入到数值栈中,再将/号压入到操作符栈中。
  7. 解析到2,将2压入到数值的栈中
  8. 解析到+号,由于+号的优先级低于除法的优先级,因此将弹出两个操作数“4”,“2”及操作符/号,进行运算得到2,将结果2,压入到数值栈中,当前操作符+号与操作符栈中的+号优先级相同,所以会再次弹出两个操作数“3”,“2”和一个操作符“+”进行运算得到5,将5压入到数值栈中。再将当前+号压入到操作数栈中。
  9. 解析到6,将6压入到数值栈中。当前遍历结束。
  10. 当前操作符栈中还存在操作符,将弹出两个数值“5”,“6”和一个操作符+,进行运算处到11

 

这就是一个数值表达式计算的完整的过程。

linux数据栈的关键数据结构skb_buf.doc linux数据栈的关键数据结构skb 立即下载

相关推荐

LSCM最小二乘保角参数化

LSCM最小二乘保角参数化 最小二乘思想 已知一组点的数据(x,y) x x1x_1x1​ x2x_2x2​ x3x_3x3​ … xnx_nxn​ y y1y_1y1​ y2y_2y2​ y3y_3y3​ … yny_nyn​ 可以近似为线性关系 y=ax+by=ax+by=ax+b ,目标为确定常数 aaa , bbb ; 解法:找到 aaa , bbb ,使得所有 yiy_iyi​ 与 axi+bax_i+baxi​+b 偏差的平方和 Q=∑i=1n(yi−axi−b)2 Q=\s

weixin_49732532的博客 4252

linux数据结构栈,Linux中踩栈浅析

调试时必需的栈知识栈(stack)是程序存放数据的内存区域之一,其特征是LIFO(Last In First Out, 后进先出)式数据结构,即后放进的数据最先被取出。向栈中存储数据的操作称为PUSH(压入),从栈中取出数据称为POP(弹出)。在保存动态分配的自动变量时要使用栈。此外在函数调用时,栈还用于传递函数参数,以及用于保存返回地址和返回值。#include #include #includ...

weixin_34902900的博客 1033

Java写项目前的准备工作指南(技术栈选择 环境搭建和工具配置 项目结构设计与模块划分)

在开始编写一个 Java 项目之前,做好充分的准备工作是至关重要的。很多初学者可能在没有清晰规划的情况下就开始编写代码,导致项目开发进度缓慢、结构混乱,甚至最终无法按预期完成。而事实上,项目的成功不仅仅取决于编码能力,还包括项目初期的规划和准备。准备工作是确保项目顺利进行的基础,它包括技术选型、环境搭建、需求分析、团队协作及项目管理等多个方面。通过这些准备,我们可以确保项目的开发不仅高效而且有可维护性,最终能交付出高质量的代码。在项目开发过程中,异常处理是非常关键的一部分。

eternal__day的博客 1187

gdb调试秘籍(寄存器、栈)

GDB的常用调试命令大家可以查阅gdb手册就可以快速的上手了,在这儿就不给大家分享了,需要的可以到GDB的官网去下载手册。这里重点分享下GDB调试中的一些寄存器和栈的相关知识用于解决下列gdb调试时的问题: 优化的代码在printf或其它glibc函数处core 没有检查返回值的函数调用异常导致的异常 优化的代码的计算异常的中间过程分析 栈溢出导致的core 局部变量越界导致栈异

Jogger_Ling的专栏 1万+

Agent 长期记忆三代演进:从 RAG 到 Memory Graph,mem0 / Zep / LangMem / Letta 深度横评

文章摘要 2026年,Agent长期记忆技术迎来关键突破,OpenAI、Anthropic等厂商通过扩大上下文窗口和推出记忆工具,推动长期记忆从工程补丁发展为独立技术层。本文通过分析三代记忆架构演进(RAG→结构化Fact→MemoryGraph)和四大方案(mem0/Zep/LangMem/Letta)的8维度横评,揭示以下核心观点: 长上下文≠长期记忆:128K上下文如同RAM,仍需硬盘式记忆层筛选和结构化存储,避免“Context Rot”导致的准确率下降。 三代架构演进: Gen1(RAG):向量检

LDZKKJ的博客 1406

C/C++基础讲解(四十三)之图形篇之绘制直线、圆、圆弧、 椭圆

程序主要是基于Visual studio 2019进行编译完成了,有兴趣的小伙伴可以自己安装下Visual studio 2019,网上有现成的教程,当然了,如果有问题,也可以和我联系,这里我们主要讲解些源码实例,不多说了,言归正传。 C语言,做为学习其他语言的基础语言,其重要性就不言而喻了.下面我将和大家一起来学习探讨C语言的相关奥秘。 实例1:绘制直线 实例2:绘制圆 实例2:绘制圆弧 实例2:绘制椭圆

hnjzfwy的博客 1234

内存问题理论基础

关于c、c++语言,内存最终是绕不过的难点和重点,没有对内存进行掌握,那么就不能认为熟悉了对应的语言。

weixin_43708235的博客 815

【Yolo12改进策略】MRFA 小核协同,构建巨大的感受野,同时保持高斯型分布|即插即用|ICCV2025

本文将介绍如何将 UniConvNet 论文中的核心模块——感受野聚合器集成到 Yolo12中,通过一种新颖的“小核协同”范式,在不显著增加计算开销的前提下,显著提升模型的感受野质量和检测精度。在目标检测中,模型要识别一个物体,不仅需要看到物体的局部特征,更需要理解其周围的上下文信息。传统卷积网络通过堆叠小卷积核(如 3x3)来扩大“感受野”,但这个过程缓慢且效率低下。而近期流行的大核卷积,虽然感受野大,但会破坏“距离越近、影响越大”的自然分布,且带来巨大的计算负担。MRFA 找到了一条“中间道路”:它通过

m0_47867638的博客 929

linux线程踩栈,Linux线程栈内存总结

何为线程栈空间泄露?何为anon内存?虚拟内存、物理内存、anon内存的联系anon与线程的联系glibc源码库线程创建与销毁anon关系使用pmap分析虚拟地址空间以及anon内存何为线程栈空间泄露?【栈空间泄露】:简单了说就是,创建了线程,系统分配了内存,但是由于异常操作,没有把之前申请的内存还给操作系统,缓存在进程中,导致这块的内存被占用,系统无法分配内存给其他进程。从用户角度,线程创建后,...

weixin_34060773的博客 1276

环形平滑标签(Circular Smooth Label, CSL)技术详解

环形平滑标签(CSL)是一种优化算法,旨在解决旋转目标检测中角度预测的边界问题。通过将角度回归转化为分类任务,并利用窗口函数平滑标签分布,CSL有效处理了角度周期性的梯度突变问题。其核心原理包括角度离散化和平滑标签编码,通过高斯、矩形、三角等窗口函数生成概率分布。CSL在技术实现上涉及标签转换流程、模型结构调整和损失函数优化,显著提升了检测精度和稳定性。在DOTA数据集上的实验表明,CSL在mAP和角度误差方面优于传统方法。应用场景包括遥感图像分析、自动驾驶和工业质检,部署时需注意旋转NMS编译和ONNX导

浩瀚之水的专栏 640

【第三方互联】3、腾讯QQ授权第三方登录

当我们创建的 QQ 互联应用成功后,我们便可以开始使用该应用来实现 QQ 互联 一、获取 APP ID 和 APP Key 1、找到我的应用 2、点击应用,进入详情 这样,我们就获取到了 APP ID 和 APP Key 二、进行开发 1、将 APP ID 、APP Key,以及该应用的信息放入项目中的配置文件中,我使用的是SpringBoot,我放在了 application.y...

JACKAL 22万+

栈的 创建,入栈,出栈,清空栈,遍历栈 的实现

数据结构 的学习视频 https://www.bilibili.com/video/av6159200?from=search&seid=6709590585276522157 一 算法: 栈: 数据进出,类向箱子放东西和拿东西,先进后出,或者说后进先出。栈分为静态栈和动态栈两种,静态栈用数组实现, 动态栈用链表实现。算法 出栈 入栈(压栈),遍历,清空。 1.创建栈 ...

xinlongkun的博客 2万+

基于语义分割的实时建图:HDMap动态更新

基于语义分割的实时建图:HDMap动态更新​ ,人工智能,计算机视觉,大模型,AI,本文围绕基于语义分割的实时建图技术在HDMap动态更新中的应用展开,介绍了语义分割基础、HDMap概述、相关实时建图技术、动态更新关键技术、系统性能评估指标、实际应用案例、面临的挑战与解决方案及未来发展趋势。阐述了该技术如何利用传感器数据和语义分割算法,解决传统HDMap构建与更新的弊端,分析了其在精度、实时性、鲁棒性等方面的表现,以及在自动驾驶和智能交通中的应用,还探讨了现存问题及未来优化方向。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 22万+

Linux中的各种栈:进程栈 线程栈 内核栈 中断栈

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈栈的作用1. 函数调用2. 多任务支持Linux 中有几种栈?各种栈的内存位置?1. 进程栈2. 线程栈3. 进程内核栈4. 中断栈 Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈 栈的作用 首先,栈 (stack) 是一种串列形式的数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行推入 (push) 和弹出 (pop) 操作。根据栈的特点,很容易的想到

BeginnerMind 4516

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

栈文档之共享栈

共享栈是顺序栈的变种。利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延申。

二木成林 7800

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

转载请注明出处: https://yakir-yang.github.io/ 栈是什么?栈有什么作用?首先,栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。

木易博客专栏 4万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

栈和栈帧

栈 堆栈(stack)又称为栈或堆叠,是计算机科学里最重要且最基础的数据结构之一,它按照FILO(First In Last Out,后进先出)的原则存储数据。 栈的相关概念: 栈顶和栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。 压栈:栈的插入操作,叫做进栈,也称压栈、入栈。 弹栈:栈的删除操作,也叫做出栈。 下面是栈的示意图,从图中可以清楚的看到,不管是插入数据还是删除数据,都是...

Casuall的博客 4960

栈的介绍 什么是栈?

栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。 栈是限制插入和删除只能在一个位置上进行的线性表。 线性表概念见:简单概括什么是线性结构和非线性结构_iamxiaobai_的博客-优快云博客 这里的“只能在一个位置上进行插入和删除”指的是栈顶,栈顶是会随着栈里面的数据元素的多少变化的,是动态变化的,一直指向栈的最上面一个数据元素。 既然有栈顶,那么就会有栈底,栈底的元素是不允许直接插入和删除的。 如图: .

fufufu_的博客 1万+

栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈栈,Stack 没人要了!

如果我们想要拿到最下面的盘子,就必须把它上面的所有盘子都拿走,像这样的一个操作,我们称之为后进先出,也就是“Last In First Out”(简称 LIFO)——最后的一个进的,最先出去。:浏览器的后退按钮会把我们访问的 URL 压入一个栈中,每次我们访问一个新的页面,新的 URL 就压入了栈的顶部,当我们点了后退按钮,最新的那个 URL 就从栈中移除,之前的那个 URL 就被访问到了。的,所以反转一串字符很容易,按照正常的顺序把字符压入栈中,然后再弹出来就行了。把元素 3 压入栈中的时候,

sunyan5211314的博客 621

栈系列之 栈排序

使用一个辅助栈完成原始栈的排序:栈顶到栈底从大到小。

一个码农的前三十年 4099

栈、共享栈、链式栈(C++实现)

栈是一种线性表。不过它只能在一端进行插入和删除操作,先入栈的数据只能后出来,而后入栈的数据只能先出来。

Edison's 小宇宙 1万+

栈的操作(入栈、出栈)之二:链栈

栈操作原则 使用栈操作数据,必须遵循“先入后出”的原则; 栈操作之链栈 链栈是用链表实现栈的存储结构,链表头部作为栈顶,链表尾部为栈底(单链表); 入栈 写入数据时,实际是对链表做“头插”操作,空链表时,头指针head指向null;新进数据插入链表头部,头指针head指向当前链表头部;以此类推,这种操作即为入栈(压栈); 出栈 读出数据时,实际是删除当前链表的头部(首元节点),将头指针head...

weixin_44612435的博客 4062

栈和栈帧的基本理解

栈(Stack)是一种数据结构,遵循“后进先出”(LIFO,Last In, First Out)的原则。在函数调用、表达式求值、内存管理等场景中。栈帧(Stack Frame)则是栈中的一个基本单位,用来存储函数调用的上下文信息。栈的示意图。

Cpingan1的博客 1843

栈的认识

栈的认识和理解 栈(stack) 栈是一种只能在一端进行插入或删除操作的线性表。 栈只能选取同一个端点进行插入和删除操作 栈的主要特点是“后进先出(LIFO)”,即后进栈的元素先出栈。栈也称为后进先出表。 1.栈的几个基本概念 允许进行插入、删除操作的一端称为栈顶。 表的另一端称为栈底。 当栈中没有数据元素时,称为空栈。 栈的插入操作通常称为进栈或入栈。 栈的删除操作通常称为退栈或出栈。 2...

weixin_45762587的博客 2033

栈的简单入栈,出栈,输出栈顶的实现

栈的简单入栈,出栈,输出栈顶的实现,内附题目和代码实现~

chaoxi6888的博客 1312
上一篇: leetcode32-最长括号匹配-栈实现
下一篇: 数据结构与算法-队列
null_null_bug
博客等级 码龄7年 72粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值