数据结构----栈

160 阅读1分钟

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: 有效的括号