1、栈的定义
特殊的线性表;后进先出;仅能在栈顶操作
2、栈有以下几个方法
- push 添加一个元素到栈顶(向桶里放入一个羽毛球)
- pop 弹出栈顶元素(从桶里拿出一个羽毛球)
- top 返回栈顶元素,注意,不是弹出(看一眼桶里最顶端的羽毛球,但是不拿)
- isEmpty 判断栈是否为空(看看羽毛球是不是都用完了)
- size 返回栈里元素的个数(数一下桶里还有多少羽毛球)
- clear 清空栈(把桶里的羽毛球都倒出来扔掉)
3、实现栈。(数组或链表)
以下用数组的方式实现一个栈
function Stack () {
var items = []; // 存储数据
// 从栈顶添加元素,也叫压栈
this.push = function (item) {
items.push(item);
}
// 弹出栈顶元素
this.pop = function () {
return items.pop();
}
// 返回栈顶元素
this.top = function () {
return items[items.length-1];
}
// isEmpty 返回栈是否为空
this.isEmpty = function () {
return items.length === 0;
}
// size 方法返回栈的大小
this.size = function () {
return items.length;
}
// clear 清空栈
this.clear = function () {
items = [];
}
}
4、栈之小练习
Q1、编写一个函数判断字符串中的括号是否合法,所谓合法,就是括号成对出现。
如: "7341())" 或 "(33821" 或 ")688(" 等都是不合法的
上代码:
function is_ok (str) {
var _stack = new Stack();
for(var i=0;i<str.length;i++){
var item = str[i];
if(item === '('){
_stack.push()
}else if(item === ')'){
if(_stack.isEmpty()){
return false
}else{
_stack.pop()
}
}
}
return _stack.size() === 0
}
思路:对这个字符串循环遍历。遇到左括号,入栈;遇到右括号出栈;如果先遇到右括号,则直接 return false,因为已经不合法了。最后判断存左括号的栈是否为空,为空则合法,反之不合法。。这样写,感觉代码可爱多了,算法真棒!
Q2: 有效的括号