数据结构学习笔记--栈

为何要学习数据结构?

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

一、栈的定义

栈是一种特殊的线性表,咱们只可以在栈顶对其进行操做,有着先进后出的特色前端

二、栈的实现

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

// 定义一个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.一、检查括号的合法性

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

  • 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()
            }
        }
    }
}
复制代码

栈还有其余不少的应用好比:一、计算代数式;二、构造表达式;三、用于函数得调用等等。编程语言

四、最后

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

相关文章
相关标签/搜索