博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构学习笔记--栈
阅读量:6958 次
发布时间:2019-06-27

本文共 2173 字,大约阅读时间需要 7 分钟。

为什么要学习数据结构?

相信大家都听过一句话程序=数据结构+算法,数据结构和算法是脱离编程语言而存在的,不同的语言有不同的实现版本,但内在的逻辑却不会有变化,所体现的编程思想不会有变化。虽然前端可能对数据结构和算法的要求没有那么高,但是作为一个程序员数据结构是我们应该掌握的基本知识。

1、栈的定义

栈是一种特殊的线性表,我们只能够在栈顶对其进行操作,有着先进后出的特点

2、栈的实现

实现栈可以用数组来存储数据,这是最简单的方式。

// 定义一个stack类function Stack() {    let items = [] // 用于存储数据,}复制代码

2.1定义栈的一些常用的方法

  • push 添加一个元素到栈顶
  • pop 弹出栈顶元素
  • top 返回栈顶元素,注意,不是弹出
  • isEmpty 判断栈是否为空
  • size 返回栈里元素的个数
  • clear 清空栈

你还可以定义其他你认为你将要用到的方法,这些只是一些常用的方法

push

// 添加一个元素到栈顶this.push = (data) => {    items.push(data)}复制代码

pop

// 删除栈顶元素this.pop = () => {    return items.pop()}复制代码

top

// 返回栈顶元素this.top = () => {    return items[items.length - 1]}复制代码

isEmpty

// 检查栈是否为空this.isEmpty = () => {    return items.length === 0}复制代码

size

// 返回栈的大小this.size = () => {    return items.length}复制代码

clear

// 清空栈this.clear = () => {    items = []}复制代码

最终代码

function Stack() {    let items = []    this.push = (data) => {        items.push(data)    }    this.pop = () => {        return items.pop()    }    this.top = () => {        return item[items.length - 1]    }    this.isEmpty = () => {        return items.length === 0    }    this.size = () => {        return items.length    }    this.clear = () => {        items = []    }}复制代码

3、栈的应用

3.1、检查括号的合法性

下面的字符串中包含小括号,请编写一个函数判断字符串中的括号是否合法,所谓合法,就是括号成对出现

  • sdf(ds(ew(we)rw)rwqq)qwewe 合法
  • (sd(qwqw)sd(sd)) 合法
  • ()()sd()(sd()fw))( 不合法

思路分析

括号存在嵌套关系,也存在并列关系,如果是用数组存储这些括号,然后再想办法一对一对的抵消掉,似乎是一个可行的办法,可是如何判断一个左括号对应的是哪个右括号呢?站在数组的肩膀上思考这个问题,就陷入到一种无从下手的绝望之中。

现在,我们站在栈的肩膀上思考这个问题,解题的步骤就非常简单,我们可以使用for循环遍历字符串的每一个字符,对每个字符做如下的操作:

  • 遇到左括号,就把左括号压如栈中
  • 遇到右括号,判断栈是否为空,为空说明没有左括号与之对应,缺少左括号,字符串括号不合法,如果栈不为空,则把栈顶元素移除,这对括号抵消掉了

当for循环结束之后,如果栈是空的,就说明所有的左右括号都抵消掉了,如果栈里还有元素,则说明缺少右括号,字符串括号不合法。

代码实现

function is_leagl(str) {    let stack = new Stack()    for(let i = 0; i < str.length; i ++) {        let item = str[i]        if(item === '(') { // 左括号入栈            stack.push(item)        } else if (item === ')') { // 右括号            if(stack.isEmpty()) { // 检查栈是否为空                return false            } else { // 不为空弹栈                stack.pop()            }        }    }}复制代码

栈还有其他很多的应用比如:1、计算代数式;2、构造表达式;3、用于函数得调用等等。

4、最后

在学习了栈之后了解到了它的方便之处,虽然是基于数据来实现的,但是在某些场景使用起来比数据更加方便快捷。后面会继续学习队列、链表、树、图等其他数据结构来丰富自己的知识。

转载地址:http://zrqil.baihongyu.com/

你可能感兴趣的文章
Oracle Study之案例--延迟块清除(deferred block cleanout)
查看>>
【LAMP】03、构建分离式的LAMP
查看>>
大快DKhadoop大数据处理平台详解
查看>>
Android卡顿优化:卡顿分析方法
查看>>
人生若只如初见
查看>>
Ext4.1中文API文档已经全部翻译完成!
查看>>
linux下tomcat 管理端无法进入
查看>>
接口在ADO.NET中使用方法
查看>>
会做人比会写程序更重要
查看>>
Python生成简单分形
查看>>
开源一套数据异地备份系统
查看>>
视频监控软件
查看>>
[web知识]网页当中使用base64表示png图片
查看>>
win 7操作系统用工具激活后总是出现激活版本提示不是正版副本解决方法
查看>>
我的友情链接
查看>>
摄影菜鸟使用的相机镜头术语大全分享
查看>>
XenServer部署系列之06——网络配置
查看>>
Python黑科技:50行代码运用Python+OpenCV实现人脸追踪+详细教程+快速入门+图像识...
查看>>
软件测试质量和效率评价之我见
查看>>
kloxo增加了域名,怎么不能访问?如何重启web服务?
查看>>