相信你们都听过一句话程序=数据结构+算法,数据结构和算法是脱离编程语言而存在的,不一样的语言有不一样的实现版本,但内在的逻辑却不会有变化,所体现的编程思想不会有变化。虽然前端可能对数据结构和算法的要求没有那么高,可是做为一个程序员数据结构是咱们应该掌握的基本知识。javascript
栈是一种特殊的线性表,咱们只可以在栈顶对其进行操做,有着先进后出的特色前端
实现栈能够用数组来存储数据,这是最简单的方式。java
// 定义一个stack类
function Stack() {
let items = [] // 用于存储数据,
}
复制代码
你还能够定义其余你认为你将要用到的方法,这些只是一些经常使用的方法程序员
// 添加一个元素到栈顶
this.push = (data) => {
items.push(data)
}
复制代码
// 删除栈顶元素
this.pop = () => {
return items.pop()
}
复制代码
// 返回栈顶元素
this.top = () => {
return items[items.length - 1]
}
复制代码
// 检查栈是否为空
this.isEmpty = () => {
return items.length === 0
}
复制代码
// 返回栈的大小
this.size = () => {
return items.length
}
复制代码
// 清空栈
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 = []
}
}
复制代码
下面的字符串中包含小括号,请编写一个函数判断字符串中的括号是否合法,所谓合法,就是括号成对出现编程
括号存在嵌套关系,也存在并列关系,若是是用数组存储这些括号,而后再想办法一对一对的抵消掉,彷佛是一个可行的办法,但是如何判断一个左括号对应的是哪一个右括号呢?站在数组的肩膀上思考这个问题,就陷入到一种无从下手的绝望之中。数组
如今,咱们站在栈的肩膀上思考这个问题,解题的步骤就很是简单,咱们可使用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()
}
}
}
}
复制代码
栈还有其余不少的应用好比:一、计算代数式;二、构造表达式;三、用于函数得调用等等。编程语言
在学习了栈以后了解到了它的方便之处,虽然是基于数据来实现的,可是在某些场景使用起来比数据更加方便快捷。后面会继续学习队列、链表、树、图等其余数据结构来丰富本身的知识。