首页 > 其他分享 >栈结构-对象形式

栈结构-对象形式

时间:2024-03-28 13:46:51浏览次数:24  
标签:count obj 对象 形式 Stack isEmpty return stack 结构

之前实现栈是通过 js 数组实现的, 其实也可以用对象形式来实现.

class Stack {
  constructor() {
    // 用一个 count 属性来记录栈的大小
    this.count = 0
    this.obj = {}
  }
}

向栈顶插入元素

即通过对象新增属性 count 和元素值 item 的形式即可.

class Stack {
  constructor() {
    // 用一个 count 属性来记录栈的大小
    this.count = 0
    this.obj = {}
  }
  // 入栈
  push(item) {
    this.obj[this.count] = item 
    this.count += 1
  }
}

用数字或者变量字符啥的作为对象的 key 会自动转换为字符的. 假设我们 push 两个元素 666, 888 进去.

const stack = new Stack()

stack.push(666)
stack.push(888)

则在内部 obj 的值和 count 属性显示如下:

obj = {
    0: 666,
    1: 888
}

判断栈是否为空

即通过判断 count 的值是否为 0 即可, 顺便实现栈的 size 方法, 本质是同一个东西.

class Stack {
  constructor() {
    // 用一个 count 属性来记录栈的大小
    this.count = 0
    this.obj = {}
  }
  // 栈是否为空
  isEmpty() {
    return this.count == 0
  }
  // 栈的大小
  size() {
    return this.count
  }
}

从栈顶移除元素

  • 当栈为空时, 返回 undefined 即可
  • 当栈有值, 因为底层对象的键是通过 count 属性从 0 开始递增的, 则长度为 count - 1
class Stack {
  constructor() {
    // 用一个 count 属性来记录栈的大小
    this.count = 0
    this.obj = {}
  }
  isEmpty() {
    return this.obj.count == 0
  }
  // 出栈
  pop() {
    if (this.isEmpty()) return undefined
      
    this.count= this.count - 1
    const item = this.obj[this.count]

    delete this.obj[this.count]
    return item
  }
}

这里的栈顶元素的键要根据 count -1 还是举例说明一下:

const obj = {}
let count = 0 

obj[count] = 1
count += 1

obj[count] = 2
count += 1

obj[count] = 3
count += 1

console.log(obj, count);
PS F:\algorithms> node .\stack_object
{ '0': 1, '1': 2, '2': 3 } 3

可以看到, count 是3, 但最后一个元素是 2 , 这样就很清晰了.

也顺带来简单测试一下入栈, 出栈的操作是否合适.

const stack = new Stack()
stack.push(666)

console.log(stack.pop());
console.log(stack.size());
console.log(stack.isEmpty());
PS F:\algorithms> node .\stack_object
666
0
true

查看栈顶元素

即实现 peek 方法, 返回栈顶元素但不做任何操作.

class Stack {
  constructor() {
    // 用一个 count 属性来记录栈的大小
    this.count = 0
    this.obj = {}
  }
  // 查看栈顶元素 
  peek() {
    if (this.isEmpty()) return undefined
    return this.obj[this.count -1]
  }
}

清空栈元素

最简单的方法是让其指向空对象, 或者通过不断地 pop.

class Stack {
  constructor() {
    // 用一个 count 属性来记录栈的大小
    this.count = 0
    this.obj = {}
  }
  // 清空栈
  clear() {
    this.count = 0
    this.obj = {}
  }
  // 当然也可以不断地 pop
  clear2() {
    while (! this.isEmpty()) {
      this.pop()
    }
  }
}

栈的 toString 方法

在数组版本的栈中, 可以直接调用其 toString 方法, 而当前的对象版本则可以手动实现一下.

class Stack {
  constructor() {
    // 用一个 count 属性来记录栈的大小
    this.count = 0
    this.obj = {}
  }
  // toString 方法
  toString() {
    if (this.isEmpty()) return ''

    let objString = `${this.obj[0]}`
    for (let i = 1; i < this.count; i++) {
      objString = `${objString}, ${this.obj[i]}`
    }
    return objString
  }
}

至此, 我们用 js 对象作为底层实现的栈也就好了. 但注意这是有缺陷的, 就是在于 countojb 这两个属性是得不到保护的. 具体咋弄就不讨论了, 主要还是以学习为主的, 自己玩.

class Stack {
  constructor() {
    // 用一个 count 属性来记录栈的大小
    this.count = 0
    this.obj = {}
  }
  // 入栈
  push(item) {
    this.obj[this.count] = item 
    this.count += 1
  }
  // 栈是否为空
  isEmpty() {
    return this.count == 0
  }
  // 栈的大小
  size() {
    return this.count
  }
  // 出栈
  pop() {
    if (this.isEmpty()) return undefined

    this.count= this.count - 1
    const item = this.obj[this.count]

    delete this.obj[this.count]
    return item
  }
  // 查看栈顶元素 
  peek() {
    if (this.isEmpty()) return undefined
    return this.obj[this.count -1]
  }
  // 清空栈
  clear() {
    this.count = 0
    this.obj = {}
  }
  // 当然也可以不断地 pop
  clear2() {
    while (! this.isEmpty()) {
      this.pop()
    }
  }
  // toString 方法
  toString() {
    if (this.isEmpty()) return ''

    let objString = `${this.obj[0]}`
    for (let i = 1; i < this.count; i++) {
      objString = `${objString}, ${this.obj[i]}`
    }
    return objString
  }
}


// test 
const stack = new Stack()
stack.push(666)

console.log(stack.pop());
console.log(stack.size());
console.log(stack.isEmpty());

stack.push(888)
stack.push(999)
stack.push(111)

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

PS F:\algorithms> node .\stack_object
666
0
true
栈元素是:  888, 999

栈还是相对好理解的, 接下来整两个关于用栈解决问题的经典案例.

标签:count,obj,对象,形式,Stack,isEmpty,return,stack,结构
From: https://www.cnblogs.com/chenjieyouge/p/18101458

相关文章

  • Linux C++ 008-结构体
    LinuxC++008-结构体本节关键字:Linux、C++、结构体相关库函数:基本概念结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。定义和使用语法:struct结构体名{结构体成员列表};通过结构体创建变量的方式有三种struct结构体名变量名struct结构体名变......
  • Day49:WEB攻防-文件上传&存储安全&OSS对象&分站&解析安全&解码还原&目录执行
    目录文件-解析方案-目录执行权限&解码还原目录执行权限解码还原文件-存储方案-分站存储&OSS对象分站存储OSS对象存储知识点:1、文件上传-安全解析方案-目录权限&解码还原2、文件上传-安全存储方案-分站存储&OSS对象文件-解析方案-目录执行权限&解码还原1......
  • Java对象转换失败-Long类型转Integer类型
    对象转换工具类/***转换工具类*/publicclassConvertUtils{privatestaticLoggerlogger=LoggerFactory.getLogger(ConvertUtils.class);publicstatic<T>TsourceToTarget(Objectsource,Class<T>target){if(source==null){......
  • 面向对象语言的全局认识
        学习一门语言,就像在一座陌生的城市旅游,第一步应该找一张这座城市的地图,对这座城市有个整体的了解,然后寻找自己的目的地,不至于迷失方向。    一句话:先整体,再局部。一.从面向过程到面向对象  1.1面向过程的困境        当软件规模超过一定的......
  • 如何系统得自学python?(基础知识篇完)——12.面向对象
     一、面向对象为了方便了解,我们拿面向过程做一个对比例如:肚子饿了,想吃饭面向过程:去超市---买菜---卖肉---买米---回家---洗菜---切肉---炒菜---煮米饭---盛饭---开吃面向对象:点外卖总结:⾯向对象就是将编程当成是⼀个事物,对外界来说,事物是直接使⽤的,不⽤去管他内部的情......
  • java基础 韩顺平老师的 面向对象(高级) 自己记的部分笔记
     373,类变量引出 代码就提到了问题分析里的3点packagecom.hspedu.static_;publicclassChildGame{publicstaticvoidmain(String[]args){//定义一个变量count,统计有多少小孩加入了游戏intcount=0;Childchild1=newChild(......
  • 头歌python循环结构答案
    Python中的循环结构,并提供一些常见的循环结构示例。在Python中,有两种主要的循环结构:`for`循环和`while`循环。###`for`循环`for`循环通常用于遍历序列(如列表、元组、字符串)或其他可迭代对象。**示例1:遍历列表中的元素**```pythonfruits=['apple','banana','cherry'......
  • Python循环结构程序设计 头歌python循环结构答案
    第2关:for循环与continue语句本关的编程任务是补全checkWork.py文件中的部分代码,具体要求如下:填入循环遍历studentname列表的代码;当遍历到缺席学生时,填入continue语句跳过此次循环。absencenum=int(input())studentname=[]inputlist=input()foriininputlist......
  • Kubernetes之存储原理和应用——资源对象与Node本地存储卷
    容器内部存储的生命周期是短暂的,会随着容器环境的销毁而销毁,具有不稳定性。如果多个容器希望共享同一份存储,则仅仅依赖容器本身是很难实现的。Kubernetes系统中,将对容器应用所需的存储资源抽象为存储卷(Volume)概念来解决这些问题。Volume是与Pod绑定的(独立于容器)与Po......
  • 使用可迭代对象作为 React 组件
    源码最近看React源码的时候发现其在处理数组的同时也对可迭代协议做了处理,因此React组件可以是一个返回可迭代对象的函数。源码如下:reconcileChildFibersImplif(isArray(newChild)){returnreconcileChildrenArray(returnFiber,currentFirstChild,newChild,lanes,......