【学习】【js】栈数据结构

栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

基于数组的栈

时间复杂度O(n),占用较多的内存空间。

export interface Stack<T = any> {push(...elements: T[]): void; // 添加一个(或几个)新元素到栈顶;pop(): T | undefined; // 移除栈顶元素,同时返回被移除的元素;peek(): T | undefined; // 返回栈顶的元素,不对栈做任何修改;isEmpty(): boolean; // 如果栈里没有任何元素就返回true,否则返回false;clear(): void; // 移除栈里所有元素;size(): number; // 返回栈里的元素个数。
}export class Stack<T = any> implements Stack<T> {#items: T[] = [];push(...elements: T[]): void {this.#items.push(...elements);}pop(): T | undefined {return this.#items.pop();}peek(): T | undefined {return this.#items[this.#items.length - 1];}isEmpty(): boolean {return this.#items.length === 0;}clear(): void {this.#items = [];}size(): number {return this.#items.length;}
}
import { describe, test, expect } from "@jest/globals";
import { Stack } from "./index";
describe("index module", () => {test("stack", () => {const stack = new Stack<number>();stack.push(1, 2, 3);expect(stack.pop()).toBe(3);expect(stack.peek()).toBe(2);expect(stack.isEmpty()).toBe(false);expect(stack.size()).toBe(2);stack.clear();expect(stack.isEmpty()).toBe(true);expect(stack.size()).toBe(0);});
});

基于对象的栈

时间复杂度O(1),占用较少的内存空间。

export interface Stack<T = any> {push(...elements: T[]): void; // 添加一个(或几个)新元素到栈顶;pop(): T | undefined; // 移除栈顶元素,同时返回被移除的元素;peek(): T | undefined; // 返回栈顶的元素,不对栈做任何修改;isEmpty(): boolean; // 如果栈里没有任何元素就返回true,否则返回false;clear(): void; // 移除栈里所有元素;size(): number; // 返回栈里的元素个数。
}export class Stack<T = any> implements Stack<T> {#count: number = 0;#items: { [key: number]: T } = {};push(...elements: T[]): void {for (let index = 0; index < elements.length; index++, this.#count++) {const element = elements[index];this.#items[this.#count] = element;}}pop(): T | undefined {if (this.isEmpty()) {return undefined;}this.#count--;const result = this.#items[this.#count];delete this.#items[this.#count];return result;}peek(): T | undefined {if (this.isEmpty()) {return undefined;}return this.#items[this.#count - 1];}isEmpty(): boolean {return this.#count === 0;}clear(): void {this.#items = {};this.#count = 0;}size(): number {return this.#count;}
}
import { describe, test, expect } from "@jest/globals";
import { Stack } from "./stack-array";
describe("index module", () => {test("stack", () => {const stack = new Stack<number>();stack.push(1, 2, 3);expect(stack.pop()).toBe(3);expect(stack.peek()).toBe(2);expect(stack.isEmpty()).toBe(false);expect(stack.size()).toBe(2);stack.clear();expect(stack.isEmpty()).toBe(true);expect(stack.size()).toBe(0);});
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/98105.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/98105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】基本指令 · 下

alias 指令起别名为什么 ls -l 指令等价于 ll 指令呢&#xff1f;指令就是可执行程序&#xff0c;和我们自己写的代码编译好的程序&#xff0c;没有本质区别&#xff01; 指令在系统的某一个位置存在&#xff01; 执行指令前&#xff0c;现在系统中查找对应的指令指令在根目录下…

计算机视觉(opencv)实战二十二——指纹图像中提取特征点,计算两两指纹之间的相似度

指纹识别原理与代码实现详解指纹识别是一种常见的生物特征识别技术&#xff0c;广泛应用于门禁系统、手机解锁、考勤打卡、身份认证等场景。其核心思想是&#xff1a;从指纹图像中提取特征点&#xff0c;计算两幅指纹之间的相似度&#xff0c;并根据相似度判断是否为同一人。本…

Linux基础之部署mysql数据库

文章目录一、环境准备二、源码解压与依赖三、CMake 编译配置四、配置 MySQL权限管理修改配置文件 /etc/my.cnf五、环境变量设置六、数据库初始化七、服务管理八、账号密码管理一、环境准备 yum -y install gcc gcc-c ncurses ncurses-devel bison cmakegcc / gcc-c&#xff1a…

代码审计-PHP专题原生开发文件上传删除包含文件操作监控Zend源码解密1day分析

快速分析脆弱&#xff1a;1、看文件路径2、看代码里面的变量&#xff08;可控&#xff09;3、看变量前后的过滤文件安全挖掘点&#xff1a;1、脚本文件名2、应用功能点3、操作关键字文件上传&#xff0c;文件下载(读取)&#xff0c;文件包含&#xff0c;文件删除等emlog-文件上…

零基础搭建 Hexo 博客:从本地到 GitHub Pages 全流程指南

零基础搭建 Hexo 博客&#xff1a;从本地到 GitHub Pages 全流程指南 Hexo 是一个快速、简洁且高效的博客框架&#xff0c;支持使用 Markdown 来编写文章&#xff0c;并能快速生成静态网页&#xff0c;非常适合想要搭建个人博客的同学。本文将带你从零开始&#xff0c;本地搭建…

Git 简介

Git 是目前全球最流行的分布式版本控制系统&#xff08;Distributed Version Control System, DVCS&#xff09;&#xff0c;核心作用是追踪文件修改历史、支持多人协同开发&#xff0c;并能高效管理代码&#xff08;或任何文本类文件&#xff09;的版本迭代。它由 Linux 内核创…

后端Web实战-Spring原理

目录 1. 配置优先级 2. Bean管理 2.1 获取Bean 2.2 Bean作用域 面试题&#xff1a;Lazy是如何解决循环依赖问题的&#xff1f; 2.3 第三方Bean 3. SpringBoot原理 3.1 起步依赖 3.2 自动配置 3.2.1 概述 3.2.2 自动配置的原理及常见方案 3.2.2.1 概述 3.2.2.2 方案…

在 Qoder 等 AI 二创 IDE 里用 VS Code Remote-SSH 的“曲线连接”实战

目标&#xff1a;让你在 Qoder 等在线/AI 辅助 IDE 中&#xff0c;也能像本地 VS Code 一样通过 Remote-SSH 连接到自己的远程服务器进行开发。 前提&#xff1a;只在你拥有或被授权的服务器上使用&#xff0c;遵守所用平台的条款与限制。两句话说清楚 先用本地 VS Code 正常连…

python发送请求SSL验证设置

这个错误通常是由于SSL/TLS握手失败导致的&#xff0c;可能原因包括证书验证问题、不兼容的加密协议或网络连接中断。以下是几种解决方案&#xff0c;按推荐顺序排列&#xff1a; 方案一&#xff1a;临时禁用SSL验证&#xff08;快速测试&#xff09; response requests.get(u…

工厂自动化正从 “人工堆叠” 向 “设备替代” 快速转变

​人工进行零件排列&#xff0c;虽在操作灵活性上有一定表现&#xff0c;但实际应用中存在明显短板&#xff0c;对工厂自动化转型形成制约。从成本来看&#xff0c;一名工人日均工资约数百元&#xff0c;若需 5-6 名工人协同作业&#xff0c;月均人力成本易突破万元&#xff0c…

中标麒麟7.4部署gitlab-runner

1. 部署环境 本次部署环境完全断网。需要离线下载gitlab-runner及其依赖。 本次部署环境为中标麒麟7.4。目前机器上部署了gitlab&#xff0c;安装了maven。 2. 部署步骤 2.1 在外部下载好依赖 我首先在腾讯云上布置了一个centos7.9的虚拟机&#xff0c;没有安装任何东西。 …

在 IDEA 2024 创建 Vue 项目(保姆级)

目录 一、 前后端分离 1. 简介 2. 实现前后端分离的常用前端框架 3. 前后端分离和动静分离 3.1 前后端分离: 3.2 动静分离: 二、 Vue.js概述 1. 简介 2. SPA介绍 2.1 优点 2.2 缺点 3. MVVM介绍 3.1 示例 三、 名词解释 1. Node.js 2. npm 3. webpack 4. Vue…

Coze源码分析-资源库-创建知识库-后端源码-应用/领域/数据访问

3. 应用服务层 3.1 知识库应用服务 文件位置: backend/application/knowledge/knowledge.go func (k *KnowledgeApplicationService) CreateKnowledge(ctx context.Context, req *dataset.CreateDatasetRequest) (*dataset.CreateDatasetResponse, error) {// 1. 转换文档类型d…

Shopify指纹手机矩阵:无限扩店,横扫FB/GG广告封号风险

一、 为什么需要为Shopify使用指纹手机&#xff1f;虽然Shopify不会因为你多开店而封号&#xff0c;但以下场景需要隔离环境&#xff1a;规避广告平台关联&#xff1a;这是最核心的用途。你会用Facebook、Google、TikTok等广告平台为你的Shopify店铺引流。这些广告平台严格禁止…

【Python】家庭用电数据分析Prophet预测

数据集&#xff1a;Household Electricity Consumption | Kaggle 目录 数据集简介 探索性分析 Prophet预测 Prophet模型 Prophet理念 Prophet优点 数据集简介 240000-household-electricity-consumption-records数据集包含了一个家庭6个月的用电数据&#xff0c;收集于2…

信息系统运维管理

运行维护服务指的是采用信息技术手段及方法&#xff0c;依据客户提出的服务要求&#xff0c;为其在使用信息系统过程中提出的需求提供的综合服务是信息技术服务中的一种主要类型。运行维护服务对象是指信息系统工程建设项目交付的内容&#xff0c;包括机房基础设施&#xff0c;…

系统编程完结整理以及补充

Shell&#xff08;命令与脚本语法&#xff09; 系统编程&#xff08;一&#xff09;shell的学习-CSDN博客 功能/概念语法/关键字参数/用法说明返回值/效果难易点注意事项示例/实验提示定义函数func_name() { commands; }无参数或通过 $1 $2 ... 传参函数执行参数传递、全局变…

第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(2、字符翻转)

参考程序&#xff1a;#include <bits/stdc.h> using namespace std;int main() {string s;cin >> s; // 读取输入字符串&#xff0c;若无输入则结束for (int i 0; i < (int)s.size(); i) {// i 从 0 开始&#xff0c;位置是 i1&#xff1b;如果 i 是奇数&#…

Django基础环境入门

熟悉过程 搭建环境&#xff0c;运行起来基础请求到服务接口跟java web对比 说明先不纠结细节先跑起来再说 1. 环境搭建 python已经安装&#xff0c;使用conda管理 django安装 django官方文档 pip install django也可以命令创建 mkdir djangotutorial django-admin startp…

408学习之c语言(结构体)

今天给大家分享C语言中结构体的几种常见使用方法&#xff0c;包括基础结构体定义与初始化&#xff0c;结构体指针的两种访问方式&#xff0c;结构体数组的遍历&#xff0c;动态内存分配与结构体使用&#xff0c;typedef简化结构体类型基础结构体定义与使用#define _CRT_SECURE_…