栈
栈是一种遵从先进后出(FILO, First In Last Out)原则的有序集合,新增加或者待删除的元素为栈顶,另一端则为栈底,只能操作栈顶元素。
- 出栈
- 入栈
在Javascript中没有对应的数据结构,可以用数组来实现。
class Stack {
constructor() {
this.arr = []
}
// 入栈
push(element) {
this.arr.push(element)
}
// 出栈
pop() {
return this.arr.pop()
}
// 栈顶
get top() {
return this.arr[this.arr.length - 1]
}
// 是否为空栈
get isEmpty() {
return !this.arr.length
}
// 栈的大小
get size() {
return this.arr.length
}
// 清空栈
clear() {
this.arr = []
}
}
栈适合解决什么问题
leetcode 20. 有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function (s) {
var map = {
')': '(',
']': '[',
'}': '{'
}
var stack = []
for (let ch of s) {
if (map[ch]) { //如果存在映射关系
if (!stack.length || stack[stack.length - 1] !== map[ch]) {
return false
}
stack.pop()
} else {
stack.push(ch)
}
}
return !stack.length
};
因此栈适合处理完全包含关系的问题
队列
与栈相对,队列是一种遵循先进先出 (FIFO, First In First Out) 原则的一组有序的项,在队尾添加元素,队首删除元素
- 队列-出队
- 队列-入队
- 队列-假溢出(其实还有空着的位置)
- 循环队列
class Queue {
constructor(items) {
this.arr = items || []
}
// 入队
enqueue(element) {
this.arr.push(element)
}
// 出队
dequeue() {
return this.arr.shift()
}
// 队首
front() {
return this.arr[0]
}
// 情况队列
clear() {
this.arr = []
}
// 队列大小
get size() {
return this.arr.length
}
// 是否为空
get isEmpty() {
return !this.arr.length
}
}
队列的应用
队列在开发工作中还是比较常用的,比如异步队列,需要等待前面的任务完成,再执行下一个任务(先入先出)
leetcode 933. 最近的请求次数
var RecentCounter = function() {
this.arr = [] //队列
};
/**
* @param {number} t
* @return {number}
*/
RecentCounter.prototype.ping = function(t) {
this.arr.push(t)
// 不在范围内就出队
while(this.arr[0] < t - 3000){
this.arr.shift()
}
return this.arr.length
};