发现数据结构之美-栈

数据结构——栈实现括号匹配 数据结构——栈实现括号匹配 真正学习之后,才发现那些所谓的大婶不过是多用功了些。不知道以前为什么不亲自动手做做,原来这么简单。 #include #include #include #include /**栈的链式存储**/ typedef struct Data{ char c; }; typedef struct Stack{ Data data; Stack *to 阅读详情

在这里插入图片描述

在代码的世界中,无论是什么语言,栈其实都是一种非常重要的数据结构。

全球闻名的代码提问社区stack overflow就以栈(stack)溢出作为网站名的一个部分。

在写代码或者是debug的过程中,相信你已经感受到了在函数调用栈的世界蹦蹦跳跳的快乐了。

在学校里刷oj,刷LeetCode,进入社会参加笔试面试的过程中,相信你也感受到了栈的强大和易用。

这篇博文非常适合数据结构基础非常薄弱的同学食用,也欢迎基础扎实的同学指正和交流。

如果从未感受过stack的美妙和强大,这篇博文将非常适合你!

  • 什么是栈?
    • 数据结构图
    • 入栈出栈图
  • JavaScript中的栈
    • 在js中,如何发现出栈LIFO的特性?
    • 如何实现一个最小栈?
    • 图解函数调用栈
  • leetcode 栈 解法题目
    • 20.有效的括号(easy)
    • 67.二进制求和(easy)
    • 905.按奇偶排序数组(easy)
    • 56.合并区间(medium)
    • 75.颜色分类(medium)
    • 228.汇总区间(medium)
    • 739.每日温度(medium)
  • 面试题 栈 解法题目
    • 实现一个BigInt

什么是栈?

  • 栈是一种后入先出(LIFO)的数据结构
  • 栈通常使用DFS(Depth First Search)遍历
  • 通常可以通过top/bottom来代表栈的顶部和底部
数据结构图

image

入栈出栈图

image

JavaScript中的栈

在js中,如何发现出栈LIFO的特性?

下面这个结构大家都熟悉,瞬间体现出栈LIFO的特性。

// 定义一个栈
let stack = [1,2,3];
// 入栈
stack.push(4); // stack [1,2,3,4]
// 出栈
stack.pop(); // 4 stack [1,2,3]
如何实现一个最小栈?

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

push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
var MinStack = function() {
  this.stack = [];
};
MinStack.prototype.push = function(x) {
  this.stack.push(x);
};
MinStack.prototype.pop = function() {
  return this.stack.pop();
};
MinStack.prototype.top = function() {
  return this.stack[this.stack.length - 1];
};
MinStack.prototype.getMin = function() {
  return Math.min(...this.stack);
};

题目:https://leetcode-cn.com/problems/min-stack/
解法:https://github.com/FrankKai/leetcode-js/blob/master/155.Min_Stack.js

图解函数调用栈

从frames stack中调用函数。

function foo(){
    let a = 10;
    return a + b + 11
}
function bar(x){
    let y = 3;
    return foo(x*y);
}
console.log(bar(7)); // 返回42

过程拆解:

  • 调用bar时,包含bar的arguments和本地变量的第一个frame创建了
  • 当bar调用foo时,包含了foo的arguments和本地变量的第二个frame创建成功,并且将其推入顶部
  • 当foo返回时,顶部的frame element会从stack中pop出来(留下bar在栈中)
  • 当bar返回时,stack清空

可视化拆解:

leetcode 栈 解法题目

  • 20.有效的括号(easy)
  • 67.二进制求和(easy)
  • 905.按奇偶排序数组(easy)
  • 56.合并区间(medium)
  • 75.颜色分类(medium)
  • 228.汇总区间(medium)
  • 739.每日温度(medium)
20.有效的括号(easy)

题目:https://leetcode-cn.com/problems/valid-parentheses/
题解:https://github.com/FrankKai/leetcode-js/blob/master/20.Valid_Parentheses.js

/**
   * 解法2:栈
   * 1.构建一个栈
   * 2.依次入栈所有开括号
   * 3.遇到闭括号时与栈顶的开括号匹配
   *   3.1若匹配上,出栈并继续
   *   3.2匹配不上,return false
   * 4.遍历结束后的栈应该为空,否则为无效括号
   */
var isValid = function(s) {
  var bracketsMap = {
    "(": ")",
    "{": "}",
    "[": "]"
  };
  var openBrackets = Object.keys(bracketsMap);
  var closeBrackets = Object.values(bracketsMap);
  var stack = [];
  var sArr = s.split("");
  for (var i = 0; i < sArr.length; i++) {
    if (openBrackets.indexOf(sArr[i]) !== -1) {
      stack.push(sArr[i]);
    } else if (closeBrackets.indexOf(sArr[i]) !== -1) {
      var top = stack[stack.length - 1];
      if (sArr[i] === bracketsMap[top]) {
        stack.pop();
      } else {
        return false;
      }
    }
  }
  return stack.length === 0;
}
67.二进制求和(easy)
/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function (a, b) {
    /**
     * 解法2:栈
     * 时间复杂度:O(n)
     * 性能:56ms, 35.5MB
     */
    let aArr = a.split("");
    let bArr = b.split("");
    let stack = [];
    let count = 0;
    while (aArr.length !== 0 || bArr.length !== 0) {
        let aPop = aArr.pop() || 0;
        let bPop = bArr.pop() || 0;
        let stackBottom = 0;
        if (stack.length > count) {
            stackBottom = stack.shift() || 0;
        }
        let sum = parseInt(aPop) + parseInt(bPop) + parseInt(stackBottom)
        if (sum <= 1) {
            stack.unshift(sum);
        } else {
            stack.unshift(sum - 2);
            stack.unshift(1);
        }
        count++;
    }
    return stack.join("");
};
905.按奇偶排序数组(easy)

题目:https://leetcode-cn.com/problems/sort-array-by-parity/
题解:https://github.com/FrankKai/leetcode-js/blob/master/905.Sort_Array_By_Parity.js

/**
 * @param {number[]} A
 * @return {number[]}
 */
var sortArrayByParity = function (A) {
  /**
   * 栈头栈尾解法即可
   * 偶数栈底推入unshift
   * 奇数栈顶推入push
   */
  var stack = [];
  for (var i = 0; i < A.length; i++) {
    if (A[i] % 2 === 0) {
      stack.unshift(A[i]);
    } else {
      stack.push(A[i]);
    }
  }
  return stack;
};
56.合并区间(medium)

题目:https://leetcode-cn.com/problems/merge-intervals/
题解:https://github.com/FrankKai/leetcode-js/blob/master/56.Merge_Intervals.js

/**
 * @param {number[][]} intervals
 * @return {number[][]}
 */
var merge = function (intervals) {
  /**
   * 解法1:排序 + 栈
   * 性能:88ms 36.3MB
   * 思路:
   * 推入区间 空栈 或者 arr[0]大于栈最后一个区间闭
   * 覆盖重叠 arr[0]小于栈最后一个区间闭
   *  */
  intervals.sort((a, b) => a[0] - b[0]);
  let stack = [];
  for (let i = 0; i < intervals.length; i++) {
    let currrentInterval = intervals[i];
    let stackLastItem = stack[stack.length - 1];
    if (stack.length === 0 || currrentInterval[0] > stackLastItem[1]) {
      stack.push(currrentInterval);
    } else if (currrentInterval[0] <= stackLastItem[1]) {
      stackLastItem[1] = Math.max(stackLastItem[1], currrentInterval[1]);
    }
  }
  return stack;
};
75. 颜色分类(medium)

题目:https://leetcode-cn.com/problems/sort-colors/
题解:https://github.com/FrankKai/leetcode-js/blob/master/75.Sort_Colors.js

var sortColors = function (nums) {
  /**
   * 解法1:递归 栈
   * 性能:64ms 35.1MB
   */
  var length = nums.length;
  var countHead = arguments[1] || 0;
  var countTail = arguments[2] || 0;
  for (var i = countHead || 0; i < length - countTail; i++) {
    if (nums[i] === 0) {
      countHead++;
      nums.unshift(nums.splice(i, 1)); // 增加if(i!==0)会降低10ms性能
      return sortColors(nums, countHead, countTail);
    } else if (nums[i] === 2) {
      countTail++;
      nums.push(nums.splice(i, 1));
      return sortColors(nums, countHead, countTail);
    }
  }
  return nums;
}
228.汇总区间(medium)

题目:https://leetcode-cn.com/problems/summary-ranges/
题解:https://github.com/FrankKai/leetcode-js/blob/master/228.Summary_Ranges.js

/**
 * @param {number[]} nums
 * @return {string[]}
 */
var summaryRanges = function (nums) {
  /**
   * 解法1:排序 + 栈
   * 性能:52ms 33.7MB
   */
  nums.sort((a, b) => a - b);
  let stack = [];
  let result = [];
  for (let i = 0; i < nums.length; i++) {
    if (stack.length === 0 || nums[i] - stack[stack.length - 1] === 1) {
      stack.push(nums[i]);
    } else {
      stackToResult();
      stack = [];
      stack.push(nums[i]);
    }
    if (i === nums.length - 1) {
      stackToResult();
    }
  }
  function stackToResult() {
    if (stack.length > 1) {
      result.push(`${stack[0]}->${stack[stack.length - 1]}`);
    } else {
      result.push(`${stack[0]}`);
    }
  }
  return result;
};

739.每日温度(medium)

题目:https://leetcode-cn.com/problems/daily-temperatures/
题解:https://github.com/FrankKai/leetcode-js/blob/master/739.Daily_Temperatures.js

  /**
   * 解法2:栈 + 递归 1132ms 19.96% 59.2MB 11.76%
   * 思路:
   * 1.通过shift取出栈底元素
   * 2.遍历剩余温度栈内温度
   *     若温度出现比栈底温度大者
   *         存储i+1
   *         递归进行下一次入栈
   *     若温度小于等于栈底温度
   *         若遍历到最后一个都没有出现更大的
   *              存储 0
   *              进行下一次入栈
   * 3.最后一个温度无论如何都肯定是0
   */
var dailyTemperatures = function(T) {
  if (T.length < 1 || T.length > 30000) return false;
  var result = arguments[1] || [];
  var bottom = T.shift();
  for (var i = 0; i < T.length; i++) {
    var t = T[i];
    if (t > bottom) {
      result.push(i + 1);
      return dailyTemperatures(T, result);
    } else {
      if (i === T.length - 1) {
        result.push(0);
        return dailyTemperatures(T, result);
      }
    }
  }
  result.push(0);
  return result;
}

面试题 栈 解法题目

实现一个BigInt

实现大整数相加,大于 Number.MAX_VALUE,不能直接使用 BigInt。

/**
* 请通过代码实现大整数(可能比Number.MAX_VALUE大)相加运算
// your code goes here
var bigint1 = new BigInt('1231230');
var bigint2 = new BigInt('12323123999999999999999999999999999999999999999999999991');
console.log(bigint1.plus(bigint2))
*/
function BigInt(value) {
  this.value = value;
}

BigInt.prototype.plus = function (bigint) {
  let aArr = this.value.split("");
  let bArr = bigint.value.split("");
  let stack = [];
  let count = 0;
  while (aArr.length !== 0 || bArr.length !== 0) {
    let aPop = aArr.pop() || 0;
    let bPop = bArr.pop() || 0;
    let stackBottom = 0;
    if (stack.length > count) {
      stackBottom = stack.shift();
    }
    let sum = parseInt(aPop) + parseInt(bPop) + parseInt(stackBottom);
    if (sum < 10) {
      stack.unshift(sum);
    } else if (sum >= 10) {
      stack.unshift(sum - 10);
      stack.unshift(1);
    }
    count++;
  }
  return stack.join("");
};

期待和大家交流,共同进步,欢迎大家加入我创建的与前端开发密切相关的技术讨论小组:

image

努力成为优秀前端工程师!

对于《数据结构与算法之美》的理解 算法 数据结构 阅读详情

相关推荐

Android 跨进程通信-(一)Binder概念引入

前言 主要对Android中的跨进程通信进行总结下,这篇先梳理下里面的涉及的一些概念 一 多进程 1.进程与线程 进程:系统中正在运行的一个应用程序,某个程序一旦运行就是一个进程,是资源分配的最小单位; 线程:程序执行的最小单位,包含在进程中,一个进程可以包含多个线程。 2.Android应用中的多进程 (1)dalivk虚拟机 Android系统的底层任务管理以及驱动都是基于Linux系统。一个Android系统其实就是一个Linux系统,通过adb shell进入连接的手机,就可以看到Li

nihaomabmt的专栏 1103

数据结构总结篇

线性表篇 数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目,它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值,至少在一段时间之后,技术可以很快得到提高。同时,它也是软考的重点,我们需要对这部分的内容进行一下总结。        这篇博文主要是通过图来解决抽象问题。不多说了,我们

逍遥飞鹤的专栏 4058

C#集成Bartender:动态图片标签打印的实战与优化

本文详细介绍了在C#程序中集成Bartender实现动态图片标签打印的实战方法与优化策略。通过具名数据源绑定、图片对象尺寸控制等核心技巧,解决了动态图片显示/隐藏的难题,并提供了从模板设计、代码架构到性能优化、错误处理的全流程指南,帮助开发者构建稳定高效的工业级标签打印系统。

weixin_29216957的博客 431

数据结构之美-深入了解树形结构

从线性结构到二叉树,是树形结构的一次飞跃。二叉树使得数据结构可以呈现层级关系,大大简化了数据组织的复杂性。平衡树在此基础上,通过平衡操作保持树的深度在可接受范围内,从而在插入、删除等操作时能保持较好的性能。多路搜索树如B树、B+树等,进一步扩展了树形结构的应用范围。它们允许节点有多个子节点,从而在保持树的平衡性方面更加灵活。多维树则将树形结构从一维扩展到多维,使得数据结构能够更好地适应复杂数据类型和多维数据关系。在应用方面,树形结构被广泛应用人工智能、图形学、网络协议等众多领域。

架构师日记 3099

什么事LLVM和Clang?Clang与GCC有什么区别?Clang如何使用?

这个问题主要讲Xcode编译器的认知,在学习iOS之前有必要学习一下Objective-C的编译环境。 在了解LLVM和Clang之前,先得了解一下什么是编译器。 编译器是一种计算机程序,它将某种编程语言(高级编程语言)写成的源代码转换成另一种编程语言(低级编程语言)。一个现代编译器的主要工作流程为:源代码->预处理器->编译器->目标代码->链接器->可执行程序...

Welcome~ 9723

湿敏电阻HR202的两种驱动方案实测:IO充放电法 vs. 交流方波ADC法,哪个更适合你?

本文深入评测湿敏电阻HR202的两种驱动方案:IO充放电法和交流方波ADC法。通过原理图分析、精度实测和资源占用对比,揭示交流方波ADC法在精度和稳定性上的优势,特别适合长期监测场景。同时提供IO充放电法在资源受限情况下的应用建议,帮助工程师根据项目需求做出最优选择。

weixin_30421809的博客 466

数据结构之美(一)数据结构绪论

(总结源自《大话数据结构》,初学数据结构推荐此书) 目录 数据结构基本概念与术语 1、数据 2、数据元素 3、数据项 4、数据对象 5、数据结构 逻辑结构和物理结构 逻辑结构 1.集合结构 2.线性结构 3.树形结构 4.图形结构 物理结构(存储结构) 1.顺序存储结构 2.链式存储结构 抽象数据类型 数据类型 1.原子类型 2.结构类型 抽象数据类型 ...

weixin_43827227的博客 656

DCMM评估报告模板样例

这篇DCMM评估报告对某数据管理公司2020年的数据管理能力进行了全面分析。报告显示,该公司在数据战略方面取得初步进展,但在数据治理和数据架构方面仍存在明显不足,包括缺乏有效治理流程、数据质量监控不足,以及数据标准化和转换灵活性不足等问题。评估报告提出了针对性改进建议,包括完善数据战略、建立治理流程、加强质量监控和提升数据转换灵活性等,为提升数据管理成熟度提供了重要指导。

cdfunlove的博客 166

《数据结构与算法之美》学习笔记一

所以说就像这门课程的作者王争老师提到的,不管是数据结构与算法,还是其他的原理性的知识、提高性的知识,你不学,就永远觉得没用,但是你学了,总有一天你会应用上,并且比普通的笨方法更优雅。对一组数据结构进行连续操作时,大部分情况下时间复杂度都很低,只有个别情况时间复杂度比较高,并且在高时间复杂度后面,跟着连续的低时间复杂度的操作,此时就可以将一组操作放到一块儿进行分析,将高时间复杂度平均到低时间复杂度上,能够使用均摊分析的场景中,一般均摊时间复杂度就等于最好情况时间复杂度。但是我们可以知道相对的执行时间。

weixin_45855469的博客 1327

从零开始创建Davinci Configurator配置工程

本文介绍了从零开始搭建达芬奇工程的详细步骤。首先安装Vector的CBD包后,通过DavicCFG.exe新建空白ECU工程。文章提到Postbuild相关概念可参考往期文章《AUTOSAR配置中的PostBuild、Precompile、Linktime》,并预告下期将讲解如何通过导入DBC文件来启用AUTOSAR模块。全文以实操截图为主,步骤清晰简明,适合开发者参考备份。

Xiaowestwind的博客 218

Redhawk:什么是timing window?

STA timing file中timing window的作用和计算方式

m0_61544122的博客 1万+

数据结构与算法之美【16】-堆

目录 ​ 堆的定义 堆的插入操作 堆的删除操作 建堆 堆排序 堆的定义 堆是一种特殊的树,它满足这两点要求: 堆是一个完全二叉树,即除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。; 堆中每个节点的值都大于等于(或者小于等于)其左右子节点的值 对于每个节点的值都大于等于子树中每个节点值的堆,我们叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫做“小顶堆”。 堆的插入操作 在堆的插入过程中,我们让新插入的节点与父节点比较大小,如果不满足子节点..

王木木 3017

AI原生应用API编排:如何实现高效的权限管理?

随着GPT-4、Claude 3等大模型的普及,AI原生应用(从设计之初就以AI为核心的应用)正从“概念”走向“落地”。依赖大量外部API的协同工作(如用户身份API→大模型生成API→支付API→存储API)。但随之而来的挑战是:如何在复杂的API调用链中,确保每个环节的权限合规?本文将聚焦这一问题,覆盖API编排的基础逻辑、权限管理的核心机制(如RBAC/ABAC)、实战工具链(如OPA策略引擎),以及常见场景的解决方案。本文将按照“场景引入→核心概念→原理拆解→实战演练→趋势展望”的逻辑展开。

大数据洞察的博客 451

《数据结构之美--栈和队列》

因为进栈和出栈都是在栈顶进行,因此这里需要定义栈顶位置,除了动态数组,还需要知道栈的空间大小,因此再定义一个容器大小。这里我们先定义了每个节点的结构,然后定义了队列结构,其中维护了指向队头和指向队尾的两个结构体指针。在这篇博客中,我们实现了具有先进后出性质的栈和具有先进先出性质的队列。下篇博客我们将练习几道关于栈和队列的oj题。

2401_87465145的博客 1235

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

[详解栈和队列]数据结构之栈与队列

✅作者简介:大家好,我是Philosophy7?让我们一起共同进步吧!🏆 📃个人主页:Philosophy7的csdn博客 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博>主哦🤞 文章目录栈和队列1.物理结构和逻辑结构2.什么是栈2.1栈的基本操作3.什么是队列队列的基本操作小结 栈和队列 1.物理结构和逻辑结构 再了解栈和队列之前,我们要先知道什么是逻辑结构和物理结构。 逻辑结构: 按照逻辑结构划分:数据结.

Philosophy7的博客 4195

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构 栈

摘要 栈是一种后进先出(LIFO)的线性数据结构,仅允许在栈顶进行插入(push)和删除(pop)操作。其核心特性包括:仅操作栈顶、不支持随机访问、默认基于deque实现。栈的提出源于1950年代鲍尔团队对逆波兰表达式计算和函数调用机制的研究,现广泛应用于程序调用栈、表达式求值、括号匹配等场景。C++中可通过STL的std::stack或手动数组实现栈操作,基本功能包括压栈、弹栈、判空等。例题B3758展示了栈在括号匹配中的典型应用——通过栈统计未匹配括号数量,动态补全成合法序列。栈的高效性使其成为算法和系

syshrgjdkdh的博客 2240

NTscan扫描工具

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

【数据结构】栈和队列超详细讲解

我们已经学习了顺序表、链表、数组等数据结构,今天我们再来认识一下栈和队列两种新的数据结构,一起来看看吧~

Become Mad的博客 3101

【数据结构】栈实现队列 & 队列实现栈

🏷️力扣地址:🌈232. 用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作 实现 类:示例1: 💫关键思路:1️⃣pop接口🌠动图解析:👇🏻2️⃣peek接口🌠动图解析:👇🏻3️⃣push接口🌠动图解析:👇🏻4️⃣empty接口💡代码实现: 🏷️力扣地址:🌈225. 用队列实现栈请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(、、 和 )。实现 类:示例1 🌍解题关键:💫关键思路:那到底是如何实......

qq_42996461的博客 1838

【数据结构】用栈实现队列

本篇总结利用栈如何实现队列的相关操作,不难观察,栈和队列是可以相互转化的,需要好好总结它们的特性,构造出一个恰当的结构来实现即可,所以本篇难点不在代码思维,而是对结构的理解。

Extreme_wei的博客 4351

数据结构——栈

在计算机科学中,数据结构(data structure)是一种数据组织、管理和存储的格式。它是相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术相关。数据结构研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系。它包含三个方面的内容:即数据的逻辑结构、数据的存储结构和数据的操作,只有这三个方面的内容完全相同,才能成为完全相同的数据结构。

2302_80243065的博客 1624

《数据结构与算法之美》- 栈

栈,在这里说的是一种数据结构。 你还可能知道的栈 提到“栈”,做Java的同学还会想起Java内存模型中的“栈”,与之紧密关联的还有一个名词——堆,但是这里,此栈非彼栈。 引用《深入理解Java虚拟机》中有关栈的介绍 经常有人把Java内存区分为堆内存(Heap)和栈内存(Stack),这种分法比较粗糙,Java内存区域的划分实际上远比这复杂。这种划分方式的流行只能说明大多数程序员最关...

baixieyun4655的博客 245

【数据结构】——栈

栈其实就是一种特殊的顺序表,其只允许在一端进出,就是栈的数据的插入和删除只能在一端进行,进行数据的插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出LIFO(Last InFirst Out)的原则。栈的插入操作叫做进栈/压栈/入栈,入栈的位置也是在栈顶。栈的删除操作叫做出栈。出栈也是在栈顶。那么我们的栈是要如何进行实现呢?我们实现栈的话有两种:链表和数组。

2302_81083101的博客 5832

【数据结构】栈

栈属于一种特殊的线性表,没错它也是线性表,之前我们讲过,线性表是逻辑结构相连,物理结构不一定相连,而栈的结构,根据我们所选择的底层结构来判断结构,可以是顺序表,也可以是链表,那这里因为栈是只允许在一端插入或删除元素,进行数据插入和删除的叫栈顶,另一端则为栈底。它只遵循后进先出的原则,因此这里使用顺序表作为底层结构,因此它的物理结构也是线性的。栈的插入叫做 入栈/压栈/进栈,入数据在栈顶部分栈的删除叫做 出栈,出数据也在栈顶。

枫の大一分享 1461

数据结构篇—栈(stack)

来看下面这样一张图:两个人对着一个两端开口的管子吹气,将整个空间充满。而其中的虫子则是来回移动。现在我们有一个栈,并给它赋予50大小的空间。这时候,我们如果将最左边序号为0的空间看作栈底0,最右边序号为49的空间看作栈底1.这样当两个栈各自进行入栈操作后就会相遇对吧,最后将整个栈空间填满,而两个栈的分界点就是图中虫子的位置。所以我们得到了这样一张图。#define MAXSIZE 50 //给栈规定空间大小//自定义int类型的数据类型ElemTypeint top0;//栈0栈顶。

2301_79702677的博客 1772

数据结构之动态栈、静态栈详解

定义: 栈是只能在一端进行数据的插入与删除的线性表。也可以理解为一种“先进后出”的存储结构。 按照内存生成的方式不同分为: 静态栈 动态栈 栈的几个概念: 允许进行插入、删除操作的一端称为栈顶。 表的另一端称为栈底。 当栈中没有数据元素时,称为空栈。 栈的插入操作通常称为进栈或入栈。 栈的删除操作通常称为退栈或出栈。 静态栈的代码如下: 1.静态栈 不用malloc函数 /* 生成...

理工大的小哥哥 2784
上一篇: 发现算法之美-双指针之对撞指针
下一篇: 浅谈浏览器架构、单线程js、事件循环、消息队列、宏任务和微任务
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趁你还年轻233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值