栈
栈是什么?
- 一个后进先出的受限线性结构
- JavaScript中没有栈,但可以用 Array 实现栈的所有功能

- Array 的 push 和 pop 方法来实现后进先出
const stack = []
stack.push(1)
stack.push(2)
stack.pop()
stack.pop()
栈的应用场景有哪些?
- 十进制转二进制
- 判断字符串的括号是否有效
- 函数调用堆栈
数组Array实现栈功能
class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
if (this.isEmpty()) {
return null;
}
return this.items.pop();
}
peek() {
if (this.isEmpty()) {
return null;
}
return this.items[this.items.length - 1];
}
isEmpty() {
return this.items.length === 0;
}
size() {
return this.items.length;
}
clear() {
this.items = [];
}
}
const stack = new Stack();
stack.push(10);
stack.push(20);
stack.push(30);
console.log(stack.peek());
console.log(stack.pop());
console.log(stack.size());
console.log(stack.isEmpty());
stack.clear();
console.log(stack.isEmpty());
基于上面实现的栈,进一步实现十进制转二进制功能
function decimalToBinary(decimalNumber) {
const stack = new Stack();
let number = decimalNumber;
let binaryString = '';
while (number > 0) {
stack.push(number % 2);
number = Math.floor(number / 2);
}
while (!stack.isEmpty()) {
binaryString += stack.pop();
}
return binaryString === '' ? '0' : binaryString;
}
const decimal = 10;
const binary = decimalToBinary(decimal);
console.log(`十进制数 ${decimal} 转换为二进制是: ${binary}`);
基于上面实现的栈,进一步实现字符串括号匹配功能
function isValidBrackets(s) {
const stack = new Stack();
const mapping = {
')': '(',
']': '[',
'}': '{'
};
for (let i = 0; i < s.length; i++) {
const char = s[i];
if (Object.values(mapping).includes(char)) {
stack.push(char);
} else if (Object.keys(mapping).includes(char)) {
const topElement = stack.pop();
if (topElement!== mapping[char]) {
return false;
}
}
}
return stack.isEmpty();
}
const str1 = "()[]{}";
const str2 = "([)]";
console.log(`字符串 "${str1}" 的括号是否有效: ${isValidBrackets(str1)}`);
console.log(`字符串 "${str2}" 的括号是否有效: ${isValidBrackets(str2)}`);