javascript实现Stack(栈)数据结构

news2024/9/24 13:18:51

上一篇文章我们理解了List这种数据结构,知道了它的特点和一些使用场景,这篇文章我们就来看一下栈这种数据结构,这里的栈可不是客栈哦,哈哈

栈其实和List非常像,使用javascript实现都是基于数组来实现

尝试理解Stack

1.栈只能在栈顶进行入栈和出栈( 我们可以尝试把栈想象成一个瓶子,瓶子只有一个瓶口,所有的东西都只能从瓶口塞进去,丛瓶口拿出来)
2. 栈是一种后进先出的数据结构(LIFO,last-in-first-out)(最后塞进瓶子的东西一定最先从瓶子里面拿出来)
3. 栈也有自己的属性和方法(瓶子里面可以塞很多东西,我们也可以取出瓶子里的东西,或清空整个瓶子)

代码实现

function Stack () {
  // 当前栈的数据
  this.data = [];
  // 栈顶位置
  this.top = 0
  // 向栈中压入一个元素
  this.push = function (elem) {
    this.data[this.top++] = elem
  }
  // 从栈中弹出(删除)栈顶元素并返回
  this.pop = function() {
    return this.data[--this.top]
  }
  // 仅返回栈顶元素,不删除
  this.peek = function() {
    return this.data[this.top-1]
  }
  // 返回栈中的元素个数
  this.length = function() {
    return this.top
  }
  // 清空栈
  this.clear = function() {
    this.top = 0
  }
}

测试一下

const s = new Stack();
s.push("David");
s.push("Raymond");
s.push("Bryan");
console.log('当前栈长度length:', s.length());
console.log('当前栈顶元素为:', s.peek());

const popped = s.pop()
console.log('被弹出的栈顶元素为:', popped);
console.log('当前栈顶元素为:', s.peek());
s.push("Cynthia");
console.log('当前栈顶元素为:', s.peek());
s.clear()
console.log('执行了清空栈');
console.log('当前栈长度length:', s.length());
console.log('当前栈顶元素为:', s.peek());
s.push("Clayton");
console.log('当前栈顶元素为:', s.peek());

测试结果:
在这里插入图片描述

实际应用

  1. 进制转换
/**
 * 进制转换
 * @param num 
 * @param base 
 */
function mulBase(num, base) {
  const s = new Stack()
  do {
    s.push(num%base)
    num = Math.floor(num/base)
  } while (num > 0)

  let converted = ''
  while(s.length() > 0) {
    converted += s.pop()
  }
  return converted
}
console.log('将10转换为二进制:', mulBase(10, 2))
console.log('将32转换为二进制:', mulBase(32, 2))
console.log('将125转换为八进制:', mulBase(125, 8))

在这里插入图片描述
2. 判断回文字符串

/**
 * 判断一个字符串是否回文字符串
 * @param word 需要判断的字符串
 */
function isPalindrome(word) {
  const s = new Stack()
  for(let i = 0; i < word.length; i ++) {
    s.push(word[i])
  }

  let rword = ''
  while(s.length() > 0) {
    rword += s.pop()
  }
  if(word === rword) return true
  return false
}
const word = "hello";
if (isPalindrome(word)) {
  console.log(word + " 是回文字符串");
}
else {
  console.log(word + " 不是回文字符串");
}

const word1 = "racecar"
if (isPalindrome(word1)) {
  console.log(word1 + " 是回文字符串");
}
else {
  console.log(word1 + " 不是回文字符串");
}

在这里插入图片描述
3. 模拟递归过程,阶乘函数

/**
 * 使用栈模拟递归过程,返回n的阶乘 n!
 * @param n 
 * @returns 
 */
function fact(n) {
  const s = new Stack()
  while (n > 1) {
    s.push(n--)
  }

  let product = 1
  while(s.length() > 0) {
    product *= s.pop()
  }
  return product
}
console.log('5的阶乘为:', fact(5))
  1. 表达式括号匹配问题
/**
 * 计算某个表达式中的括号是否匹配
 * @param str 表达式
 * @returns 匹配情况
 */
function isMatch (str) {
  const match = {
    match: true,
    position: -1
  }
  const left = new Stack()
  const right = new Stack()
  const ml = ['(', '[', '{']
  const mr = [ ')', ']', '}']
  for (let i = 0; i < str.length; i ++) {
    if (ml.includes(str[i])) {
      left.push({
        value: str[i],
        position: i
      })
    }
    if (mr.includes(str[i])) {
      right.push({
        value: str[i],
        position: i
      })
    }
  }

  while (left.length() || right.length()) {
    const l = left.pop()
    const r = right.pop()
    let index
    if (l) index = ml.findIndex((item) => item === l.value)
    else index = mr.findIndex((item) => item === r.value)
    if (mr[index] !== r?.value || ml[index] !== l?.value) {
      match.match = false
      match.position = l ? l.position : r.positon
      return match
    }
  }

  return match
}

const string = '2.3 + 23/12 + (3.14159 * 0.24'
if (!isMatch(string).match) {
  console.log(`表达式${string}括号不匹配,不匹配位置为:`, isMatch(string).position)
} else {
  console.log(`表达式${string}括号匹配成功`)
}
const string1 = '({ab}(c)ccc['
if (!isMatch(string1).match) {
  console.log(`表达式${string1}括号不匹配,不匹配位置为:`, isMatch(string1).position)
} else {
  console.log(`表达式${string1}括号匹配成功`)
}

在这里插入图片描述
好了,文章就到这里了,大家如果想了解更多就去看《数据结构与算法javascript描述》这本书吧,希望大家都能有所收获~

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

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

相关文章

阿里云-虚拟主机退订

退订说明&#xff1a; https://help.aliyun.com/zh/cloud-web-hosting/product-overview/refund-instructions#section-bou-yhd-exp 进入菜单&#xff1a; https://usercenter2.aliyun.com/refund/refund 注&#xff1a; 1、退款只能到余额 2、已开票的款项&#xff0c;会…

【Spark精讲】RDD特性之数据本地化

目录 首选运行位置 数据的本地化级别 谁来负责数据本地化 数据本地化执行流程 调优 代码中的设置方法 首选运行位置 上图红框为RDD的特性五&#xff1a;每个RDD的每个分区都有一组首选运行位置&#xff0c;用于标识RDD的这个分区数据最好能够在哪台主机上运行。通过RDD的…

SQL中的三值逻辑:TRUE、FALSE 和 UNKNOWN。

在SQL中&#xff0c;通常采用三值逻辑处理条件表达式的真值。这种逻辑是基于三种可能的真值状态&#xff1a;TRUE、FALSE 和 UNKNOWN。 TRUE&#xff08;真&#xff09;&#xff1a; 表示条件为真或成立。 FALSE&#xff08;假&#xff09;&#xff1a; 表示条件为假或不成立。…

迎接数字化,亿发智能ERP管理系统解决方案,助力湖南企业精益生产提效

近年来&#xff0c;湖南省生产企业都尝试调整升级&#xff0c;进行数字化转型。因传统车间的管理业务存在着多方面的问题&#xff0c;如信息传输不畅、缺乏共享和互动功能&#xff0c;以及缺乏先进的统计、分析、预测及决策手段等&#xff0c;直接影响了公司生产效率的提高&…

LLM(六)| Gemini:谷歌Gemini Pro 开放API ,Gemini Pro 可免费使用

近期&#xff0c;Google Gemini Pro 开放API 了&#xff0c;且Gemini Pro 可免费使用&#xff01;Gemini Pro支持全球180个国家的38种语言&#xff0c;目前接受文本作为输入并生成文本作为输出。 Gemini API 地址&#xff1a;http://ai.google.dev Gemini Pro 的表现超越了其他…

shopee数据分析工具:提升电商竞争力,探索Shopee工具的价值

在如今竞争激烈的电商市场中&#xff0c;商家需要利用各种工具和策略来提高自己的竞争力。Shopee作为一家知名的电商平台&#xff0c;为商家提供了一系列强大的数据分析工具&#xff0c;帮助商家更好地了解市场趋势、优化产品策略和提高运营效果。本文将介绍几款常见的Shopee数…

Pearson、Spearman 相关性分析使用

介绍 Pearson 积差相关系数衡量了两个定量变量之间的线性相关程度。 用来衡量两个数据集的线性相关程度&#xff0c;仅当一个变量的变化与另一个变量的比例变化相关时&#xff0c;关系才是线性的。 Spearman等级相关系数则衡量分级定序变量之间的相关程度。斯皮尔曼相关系数不…

【WinForm.NET开发】使用 TableLayoutPanel 在 Windows 窗体上排列控件

本文内容 创建项目在行和列中排列控件使用停靠和定位在单元格内放置控件设置行和列属性使用控件跨越行和列通过在工具箱中双击控件将其插入自动处理溢出通过绘制控件轮廓将其插入单元格内不允许有多个控件交换控件后续步骤 某些应用程序需要这样一个窗体&#xff0c;该窗体的…

C语言之⽂件操作

一为啥需要文件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久化的保…

docker consul容器自动与注册

微服务&#xff08;容器&#xff09;注册与发现&#xff1a;是一种分布式的管理系统&#xff0c;定位服务的方法。 在传统架构当中&#xff0c;应用程序之间直连到已知服务&#xff0c;设备提供的网络&#xff1a;IP地址&#xff0c;基于tcp/ip&#xff0c;端口&#x…

关于linux 磁盘占用排查问题

1.关于磁盘 查看整体磁盘占用大小 df -h 2. 先排除mysql 数据大小 查询库的大小 SELECT table_schema AS "Database", ROUND(SUM(data_length index_length) / 1024 / 1024, 2) AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema…

认识产品经理以及Axure简单安装与入门

目录 一.认识产品经理 1.1.项目团队 1.2.概述 1.3.认识产品经理 1.4.产品经理工作范围 1.5.产品经理工作流程 1.6.产品经理的职责 1.7.产品经理的分类 1.8.产品经理能力要求 1.9.产品工具 1.10.产品体验报告 二.Axure简介 三.应用场景 四.安装与汉化 4.1.安装 4…

Vue3-19-组件-定义和基本使用

组件的定义 个人理解 &#xff1a;1、组件&#xff0c;就是我们把某个功能模块进行封装&#xff0c;在使用时直接引入进行使用&#xff0c;极大的提高了代码的可复用性。2、在vue 中&#xff0c;一个 [.vue] 文件&#xff0c;就是一个组件。3、组件之间存在【引入】 与 【被引…

Vue.js 使用基础知识

Vue.js 是一款用于构建用户界面的渐进式框架&#xff0c;它专注于视图层。Vue.js 不同于传统的 JavaScript 框架&#xff0c;它采用了组件化的开发方式&#xff0c;使得开发者可以更加高效和灵活地构建交互式的 Web 应用程序。 目录 什么是 Vue.js安装 Vue.jsVue 实例模板语法插…

数据分析为何要学统计学(7)——什么问题适合使用t检验?

t检验&#xff08;Students t test&#xff09;&#xff0c;用于通过小样本&#xff08;样本容量n < 30&#xff09;对总体均值水平进行无差异推断。 t检验要求样本不能超过两组&#xff0c;且每组样本总体服从正态分布&#xff08;对于三组以上样本的&#xff0c;要用方差…

获取Java类路径

利用System.getProperty(“java.class.path”)可以获取Java类路径&#xff08;Java class path&#xff09;。 package com.thb;import java.io.IOException;public class Test5 {public static void main(String[] args) throws IOException {System.out.println(System.getP…

MySQL数据库 DDL

目录 一、DDL 二、操作数据库 三、操作表 四、数据类型 五、表操作案例 六、修改表 七、删除表 一、DDL Data Definition Language&#xff0c;数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段) 。 二、操作数据库 &#xff08;1&am…

Linux学习第47天:Linux音频驱动试验:能不能?不行也得行。

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 CAN 是目前应用非常广泛的现场总线之一&#xff0c;主要应用于汽车电子和工业领域&#xff0c;尤其是汽车 领域&#xff0c;汽车上大量的传感器与模块都是通过 C…

OceanMind海睿思案例入选第二届中国数据治理年会“DCMM百项优秀案例”

近日&#xff0c;中国电子信息行业联合会在北京成功举办“第二届中国数据治理年会”。 本届大会以“数据强基、智领未来”为主题&#xff0c;汇聚我国数据治理领域的资深专家、学者、企业大咖同台论道&#xff0c;共话数据未来的发展与创新。 中新赛克海睿思作为DCMM3级乙方代…

Python自动化批量篆刻Polygon动物铭文$ANTS

铭文介绍 Polygon马蹄链动物主题铭文 A N T S 总量 2100 w 张&#xff0c;当前还剩余 76 ANTS 总量2100w张&#xff0c;当前还剩余76%&#xff0c;成本很低0.003MATIC一张&#xff0c;可以打了防身。 BRC20比特币铭文生态有RATS老鼠大军&#xff0c;PRC20马蹄有ANTS蚂蚁大军&a…