首页 > 其他分享 >栈结构-数组形式

栈结构-数组形式

时间:2024-03-27 20:23:34浏览次数:28  
标签:arr 形式 元素 栈顶 pop 数组 push stack 结构

栈是一种 "后进先出 (LIFO)" 的线性结构, 特点是只有一个出口. 对于新增或者待删除的元素都保存在栈的同一端, 成为 "栈顶". 另一端则就是 "栈底" 了. 新加的元素靠近栈顶, 旧元素靠近栈顶.

就好比一口深井管道, 上面的出口是栈顶, 底部是栈底. 先掉下来兄弟, 沉得愈深, 后掉下来的兄弟则愈接近栈顶, 能被优先带粗去.

那这种结构有什么用的, 列举几种最常见的场景:

  • 内存中的变量保存, 方法调用, 表达式求值
  • 浏览器历史记录回退, 用户操作撤回
  • 编程语言的编辑器符号对称验证
  • 递归算法的计算过程
  • 进制转换等

反正就是很多啦, 在 javascript 语言中, 我们可以先用数组作为底层结构来模拟栈这样的数据结构, 当然用对象也是可以的.

class Stack {
  constructor() {
    this.arr = []
  }
}

然后要为栈声明一些常用的方法.

  • push (items) : 添加一或多个元素到栈顶
  • pop ( ) : 移除并返回栈顶元素
  • peek ( ) : 返回栈顶元素, 不做其他任何操作
  • clear ( ) : 移除栈里所有元素
  • size ( ) : 返回栈里元素个数, 类似 arr.length
  • isEmpty ( ) : 如果栈里无元素返回 true, 否则返回 false

向栈顶添加元素 push

元素入栈, 直接通过底层的数组的 push 方法, 尾部添加元素即可.

class Stack {
  constructor() {
    this.arr = []
  }
  // 入栈
  push(item) {
    this.arr.push(item)
  }
}

从栈顶移除元素 pop

元素出栈, 直接通过底层的数组的 pop 方法, 尾部删除元素即可.

class Stack {
  constructor() {
    this.arr = []
  }
  // 出栈
  pop() {
    return this.arr.pop()
  }
}

查看栈顶元素

即返回底层数组的最后一个元素即可, 可通过数组索引实现.

class Stack {
  constructor() {
    this.arr = []
  }
  // 查看栈顶元素
  peek() {
    return this.arr[this.arr.length - 1]
  }
}

检查栈是否为空

即判断底层数组的 length 属性的值, 顺便再实现一下 size 方法, 本质是同一个东西.

class Stack {
  constructor() {
    this.arr = []
  }
  // 是否为空
  isEmpty() {
    return this.arr.length == 0
  }
  // 栈的元素个数或长度
  size() {
    return this.arr.length
  }
}

清空栈元素

简单粗暴的方法就是让底层数组指向一个 [ ] 即可, 当然也可以不断调用 pop 来移除所有元素.

class Stack {
  constructor() {
    this.arr = []
  }
  // 清空栈
  clear() {
    this.arr = []
  }
}

至次, 一个栈的数据结构我们就实现了!

// stack_array.js 

class Stack {
  constructor() {
    this.arr = []
  }
  // 入栈
  push(item) {
    this.arr.push(item)
  }
  // 出栈
  pop() {
    return this.arr.pop()
  }
  // 查看栈顶元素
  peek() {
    return this.arr[this.arr.length - 1]
  }
  // 是否为空
  isEmpty() {
    return this.arr.length == 0
  }
  // 栈的元素个数或长度
  size() {
    return this.arr.length
  }
  // 清空栈
  clear() {
    this.arr = []
  }
}

简单使用栈

const stack = new Stack()

console.log('栈是否为空: ', stack.isEmpty());
// 入栈
stack.push(1)
stack.push(2)
stack.push('youge')

console.log('栈顶元素是: ', stack.peek());

console.log('栈的长度是: ', stack.size());
console.log('栈是否为空: ', stack.isEmpty());

stack.push(666)
stack.push(888)
console.log('正在移除栈顶元素是: ', stack.pop());
console.log('正在移除栈顶元素是: ', stack.pop());

PS F:\algorithms> node .\stack_array.js
栈是否为空:  true
栈顶元素是:  youge
栈的长度是:  3
栈是否为空:  false
正在移除栈顶元素是:  888
正在移除栈顶元素是:  666

当然这里栈的简单建立是以数组形式的, 但我们也可以用对象形式的创建, 它在一些操作上的时间和空间复杂度是不一样的.

标签:arr,形式,元素,栈顶,pop,数组,push,stack,结构
From: https://www.cnblogs.com/chenjieyouge/p/18100142

相关文章

  • 数据结构——栈(C语言版)
    前言:在学习完数据结构顺序表和链表之后,其实我们就可以做很多事情了,后面的栈和队列,其实就是对前面的顺序表和链表的灵活运用,今天我们就来学习一下栈的原理和应用。准备工作:本人习惯将文件放在test.c、SeqList.c、SeqList.h三个文件中来实现,其中test.c用来放主函数,SeqList.c......
  • 对数组方法reduce和map的深入理解,用reduce方法实现map方法
     引言:偶然看到一道面试题,希望可以用reduce方法实现map方法,看过之后发现这是个有趣的逻辑思维题、既要对数组方法有深入理解也要有一定编程能力。一、reduce语法reduce:高阶数组方法,对数组中的所有元素应用一个函数(由你提供),将其减少为单个输出值。arr.reduce((prev,cur,ind......
  • 数组自定义unshift和去重
    arr=[1,2,4,5]arrObj=Object.assign([],arr)//自定义实现数组unshiftArray.prototype.myunshift=function(...eles){constlen=this.lengthfor(leti=1;i<=len;i++){arr[i]=arrObj[i-1]}varargs=Array.from(eles);arr[0]=......
  • Java开发千万别错过的好课程:Java版数据结构和算法+AI算法课程13
    AI人工智能时代,Java从业者必学科目精品课程推荐:Java版数据结构和算法+AI算法课程【点击开始学习】工作机会推荐和资源分享群:819391432学习地址:https://class.imooc.com/sale/fullstackalgo在当今数字时代,数据已成为驱动创新和决策的关键资源。为了在这个竞争激烈的世界......
  • 03-JavaScript数组
    1.通过直接量创建数组vararr=[1,2,3,'abc','true'];console.log(arr);2.通过构造函数来创建数组vararr2=newArray("张三","李四");console.log(arr2);vararr3=newArray(5);//数组长度console.lo......
  • DM相关表结构查询
    --查询表名SELECTtable_nameFROMdba_tablesWHEREowner='所有者'ORDERBYtable_name--查询表注释SELECTT.table_name,U.COMMENTSAstable_commentFROMDBA_TABLESTJOINUSER_TAB_COMMENTSUONT.TABLE_NAME=U.TABLE_NAMEWHEREOWNER='所有者'ORDER......
  • pat mooc 浙江大学数据结构 01-复杂度1 最大子列和问题
    输入格式:输入第1行给出正整数K(≤100000);第2行给出K个整数,其间以空格分隔。输出格式:在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。输入样例:6-211-413-5-2输出样例:20#include<stdio.h>intmain(){ intk,n; intsum=0; intm......
  • JavaScript数组常用方法
    数组的常用方法有push(),unshift(),pop(),shift(),reverse(),sort(),splice(),concat(),join(),slice(),.....在工作中常用到的有增删改查,前增unshift,后增push(),前删shift(),后删pop(),修改指定元素splice(),查找indexOf(),lastindexof(),和ES6新增的数组方法forEach()、map()、filter()、r......
  • 结构化布线系统
    网络规划和设计过程是一个迭代和优化的过程结构化综合布线系统是基于现代计算机技术的通信物理平台,集成了语音、数据、图像、视频的传输功能,消除了原有通信线路在传输介质上的差别 综合布线六大子系统工作区子系统终端到网口(信息插座)之间水平子系统网口(信......
  • Python程序设计 循环结构
    1.达依尔的麦子数相传古印度宰相达依尔,是国际象棋的发明者。有一次,国王因为他的贡献要奖励他,问他想要什么.达依尔说:”只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:第一格一粒,第二格两粒,……,后面一格的麦子总是前一格一麦子数的两倍,摆满整个棋盘,我就感恩不尽了。......