栈 Stack
先入后出
添加、删除:O(1)
查询O(n)
最近相关性
队列 Queue
先进先出
添加、删除:O(1)
查询O(n)
先来后到
双端队列 Deque(Double-End Queue)
添加、删除:O(1)
查询O(n)
Stack、Queue、Deque 工程实现
优先队列(Priority Queue)
插入O(1)
取出O(logN): 按照元素的优先级取出
底层具体实现的数据结构较为复杂多样 heap、bst、treap
总结
预习题目
有效的括号(亚马逊、JPMorgan 在半年内面试常考)
// 0、如果字符串是奇数,则肯定不合法// 1、用map 以key:val的形式存储括号队// 2、遍历字符串,将左侧括号存入栈中// 3、匹配到右括号时,判断是否和栈里最后一个左括号匹配,匹配则pop出去,否则返回falsevar isValid = function (s) {if (s % 2) {return false;}let map = new Map([["}", "{"],[")", "("],["]", "["],]);let stack = [];for (let i = 0; i < s.length; i++) {// 如果匹配到右括号, 去栈匹配是否有对应的右括号if (map.has(s[i])) {// 取栈头部元素,看是否匹配if (!stack.length || map.get(s[i]) !== stack[stack.length - 1]) {return false;}stack.pop();} else {// 如果匹配到左括号,入栈stack.push(s[i]);}}return !stack.length;};
最小栈(亚马逊在半年内面试常考) ```javascript var MinStack = function() { this.x_stack = []; // 用数组模拟栈结构 this.min_stack = [Infinity]; // 维护一个最小栈 };
MinStack.prototype.push = function(x) { this.x_stack.push(x); // 每入一个新元素,都向最小栈中推入一个新元素和当前最小值中小的那个 this.min_stack.push(Math.min(this.min_stack[this.min_stack.length - 1], x)); };
MinStack.prototype.pop = function() { this.x_stack.pop(); this.min_stack.pop(); // 每次pop一个元素 };
MinStack.prototype.top = function() { return this.x_stack[this.x_stack.length - 1]; };
MinStack.prototype.getMin = function() { return this.min_stack[this.min_stack.length - 1]; }; ```
