什么是栈?

菜园前端
• 阅读 225

原文链接:https://note.noxussj.top/?source=helloworld


栈是基础数据结构,栈是一种遵循后进先出原则的有序集合,添加新元素的一端称为栈顶,另一端称为栈底。操作栈的元素时,只能从栈顶操作(添加、移除、取值)。

什么是栈?

实现功能

在 JavaScript 中没有栈,但是可以通过 Array 实现栈的所有功能

  • push () 入栈
  • pop () 出栈
  • top () 获取栈顶值
  • size () 获取栈的元素个数
  • clear () 清空栈

应用场景

  • 十进制转二进制
  • 判断字符串的括号是否有效
  • 函数调用堆栈
  • 二叉树前序遍历(迭代方式)
  • ...

基础案例

通过数组实现

const stack = [1]
stack.push(2) // 入栈
stack.pop() // 出栈
const top = stack[0] // 获取栈顶值
const size = stack.length // 获取栈的元素个数
stack.length = 0 // 清空栈

通过类模拟实现

class Stack {
    constructor() {
        this.data = {}
        this.count = 0
    }

    /**
     * 入栈
     */
    push(item) {
        this.data[this.count++] = item

        return item
    }

    /**
     * 出栈
     */
    pop() {
        if (this.count > 0) {
            const item = this.data[this.count - 1]
            delete this.data[--this.count]

            return item
        } else {
            return -1
        }
    }

    /**
     * 获取栈顶值
     */
    top() {
        if (this.count > 0) {
            return this.data[this.count - 1]
        } else {
            return -1
        }
    }

    /**
     * 获取栈的元素个数
     */
    size() {
        return this.count
    }

    /**
     * 清空栈
     */
    clear() {
        this.data = {}
        this.count = 0
    }
}

const stack = new Stack()

stack.push('a')
stack.push('b')
stack.push('c')

stack.pop()
点赞
收藏
评论区
推荐文章
九路 九路
3年前
5 手写Java Stack 核心源码
Stack是Java中常用的数据结构之一,Stack具有"后进先出(LIFO)"的性质。只能在一端进行插入或者删除,即压栈与出栈栈的实现比较简单,性质也简单。可以用一个数组来实现栈结构。1.入栈的时候,只在数组尾部插入2.出栈的时候,只在数组尾部删除我们来看一下Stack的用法:如下publicstaticvoidmai
Easter79 Easter79
2年前
stack顺序存储结构
《偶刚开始学习数据结构,欢迎拍砖111》栈是只能通过访问它的一段来实现数据存储的一种线性数据结构,换句话来说就是先进后出的原则,FILO,与队列刚好相反哈,现在只说stack。栈包括以下几种基本运算(1)初始化(2)判断是否为空(3)push(4)pop(5)top其他的则根据这几种基本操作进行组合,即可实现。栈的实现同样
菜园前端 菜园前端
1年前
什么是JavaScript 调用栈?
原文链接:什么是调用栈?我们写的JS代码大多数都是同步模式,也就是从上往下依次执行。后一个任务必须要等前一个任务结束才能开始执行,程序的执行顺序和我们代码的编写顺序是完全一致的。程序执行中每遇到一个任务都会先入栈,当前入栈的任务执行完毕后就会出栈。本来栈的
似梦清欢 似梦清欢
1年前
栈和队列
栈原理栈(stack)又名堆栈,是一种只能在表尾进行插入和删除操作的线性表。能够进行操作的这一端被称为栈顶,相对地,把另一端称为栈底。:::warning栈内元素操作时先进后出,类似于电梯上下成员,最后进去的人最先出
Wesley13 Wesley13
2年前
Java实现顺序栈
一、分析  栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表。  顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。  一个标准的顺序栈
Wesley13 Wesley13
2年前
C语言利用va_list、va_start、va_end、va_arg宏定义可变参数的函数
在定义可变参数的函数之前,先来理解一下函数参数的传递原理:1、函数参数是以栈这种数据结构来存取的,在函数参数列表中,从右至左依次入栈。2、参数的内存存放格式:参数的内存地址存放在内存的堆栈段中,在执行函数的时候,从最后一个(最右边)参数开始入栈。因此栈底高地址,栈顶低地址,举个例子说明一下:voidtest(inta,floatb,ch
Stella981 Stella981
2年前
JVM 字节码指令表
字节码助记符指令含义0x00nop什么都不做0x01aconst\_null将null推送至栈顶0x02iconst\_m1将int型1推送至栈顶0x03iconst\_0将int型0推送至栈顶0x04iconst\_1将int型1推送至栈顶0x05ic
Stella981 Stella981
2年前
JVM总结3
    垃圾收集GarbageCollection通常被称为“GC”,它诞生于1960年MIT的Lisp语言,经过半个多世纪,目前已经十分成熟了。    jvm 中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于java堆和
Wesley13 Wesley13
2年前
Java内存管理
一、Java内存分类1、Java有几种存储区域?\寄存器\在CPU内部,开发人员不能通过代码来控制寄存器的分配,由编译器来管理\栈\在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域,即栈顶的地址和栈的最大容量是系统预先规定好的。\优点:由系统自动分配,速度较快。
菜园前端 菜园前端
11个月前
什么是队列
原文链接:什么是队列?队列是一种遵循先进先出原则的有序集合,添加新元素的一端称为队尾,另一端称为队首。实现功能在JavaScript中没有队列,但是可以通过Array实现队列的所有功能enqueue()入队dequeue()出队top()获取队首值size