栈的介绍
1.栈是什么
栈是类似于列表的一种数据结构,栈的一端叫栈顶,栈的另一端叫栈底,栈的数据插入、删除只能从栈顶开始,所以栈遵循“后进先出”的原则,可以理解为先进栈的数据放在底部,再进栈的数据放在前一个进栈的数据的头部,如图所示:
上图中 、进栈的顺序为1先进栈==>2进栈==3进栈,出栈的顺序为3出栈==》2出栈==》1==》出栈 栈遵循“后进先出”的原则
2.栈的常规操作
- push():添加一个(或几个)新元素到栈顶,进栈
- pop():移除栈顶的元素,同时返回被移除的元素,出栈
- peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)
- isEmpty():如果栈里没有任何元素就返回true,否则返回false
- clear():移除栈里的所有元素
- size():返回栈里的元素个数,该方法和数组的length 属性很类似
3.用js 数组实现一个栈
// 栈 后进先出
class Stack {
constructor() {
this.arr = [];
}
// 进栈
push(val) {
return this.arr.push(val);
}
//出栈
pop() {
return this.arr.pop();
}
//返回栈顶的元素
peek() {
return this.arr[this.arr.length - 1];
}
// 检查栈为空
isEmpty() {
return this.arr.length === 0;
}
// 移除栈的所有元素
clear() {
this.arr.length = 0;
}
// 栈的大小
size() {
return this.arr.length;
}
}
const stack = new Stack();
stack.push(4);
stack.push(3);
stack.push(2);
stack.push(1);
stack.pop();
console.log(stack.arr); //[ 4, 3, 2 ]
4.栈的应用
1.把一个10进制的数用2进制表示出来
100的二进制是1101110
// 十进制转二进制
function binary(number) {
const stack = new Stack();
let val = 0; // 余数
let top = "";
while (number > 0) {
val = number % 2;
stack.push(val);
number = Math.floor(number / 2);
}
console.log(stack.arr);
while (!stack.isEmpty()) {
top += stack.pop();
}
return top;
}
console.log(binary(100)); //1101110
2.有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号
Leetcode 20:leetcode.cn/problems/va…
function isValid(s) {
if (s.length < 1) return false;
const arr = [];
for (let i = 0; i < s.length; i++) {
let str = s[i];
if (str === "(") {
arr.push(")");
} else if (str === "{") {
arr.push("}");
} else if (str === "[") {
arr.push("]");
} else {
if (str !== arr.pop()) {
return false;
}
}
}
return arr.length === 0;
}
isValid("(}"); // false