栈定义
- 栈是一种线性结构,可以用装羽毛球的筒子类比,先入后出(FILO).
- 特点: 最早进入的元素存放的位置叫做栈底, 最后进入的元素存放的位置叫做栈顶.
- 表现形式: 栈这种数据结构可以用数组来实现,也可以用链表来实现.
- 入栈: 入栈操作就是把新元素放入栈中,只允许从栈顶一侧放入元素,新元素的位置将会成为新的栈顶.
- 出栈: 出栈操作就是把元素从栈中弹出,只有栈顶元素才允许出栈,出栈元素的前一个元素将会成为新的栈顶。
栈的相关操作(使用数组模拟)
function Stack(){
this.items = [];
// 入栈操作
Stack.prototype.push = function(item){
this.items.push(item);
}
// 出栈操作
Stack.prototype.pop = function(){
return this.items.pop();
}
// 栈是否为空
Stack.prototype.isEmpty = function(){
return this.items.length == 0;
}
// 栈长度
Stack.prototype.size = function(){
return this.items.length;
}
// 打印栈数据
Stack.prototype.toString = function(){
let str = '';
for (let index = 0; index < this.items.length; index++) {
const item = this.items[index] + ' ';
str += item;
}
return str;
}
}
复制代码
应用
题目
- 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效(来自leetCode)
解题思路
- 首先创建了一个数组,内部存储了所有的可能性['{}', '[]', '()']
- 把传入的字符串转成集合,然后遍历获取每一个元素,同时判断当前元素和栈顶的元素拼接,然后去可能性数组中查询是否存在
- 如果存在就说明是一个正确的字符串,那么直接把栈顶的元素从栈中移除
- 如果不是正确的字符串,就加入到栈中
- 最后判断,如果栈中有元素存在,那就肯定是不合标准的字符串。
代码实现
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let stack = [];
let resArr = s.split('');
if (resArr.length <= 1) return false;
let allResult = ['()', '[]', '{}'];
for(let i=0; i<resArr.length; i++){
if (stack.length === 0) {
stack.push(resArr[i]);
}else{
let current = stack[stack.length - 1];
let appent = current + resArr[i];
if (allResult.indexOf(appent) != -1) {
stack.pop();
}else{
stack.push(resArr[i]);
}
}
}
return stack.length === 0;
};
复制代码