读书笔记--数据结构之栈(一)

前言:我们所接触的数据结构有:栈,队列,链表,哈希等;

经常用,但可能没深入了解其原理。以下是我的读书笔记;

借一下图:

栈的结构,好像是一个桶,先放进去的,就垫底,后放进去的在上面。只能从上面拿,所以有先进后出、后进先出的性质。

比如:

定义的规则是:1.我们可以从上面放入一个东西(元素)

2.我们可以拿(弹)出最上面的东西(元素)

3.查看元素,我们只看最上面一个(元素),只看不弹出来;

4.我们可以知道这个容器里的东西(元素)是否为空;

5.我们可以知道容器有多少个东西(元素);

6.我们可以一次性全部清空,(倒出来所有元素);

满足这6点的特性,就是一个基本的栈结构。

问题1:如下图规则,如何校验字符串是否合法。

问题2:如下图,完成中序表达转后续表达式。

 核心代码:

封装一个栈类:

<script>
    //
    function Stack() {
        var items = [];//使用数组存储数据

        //push 方法添加一个元素到栈顶
        this.push = function (item) {
            items.push(item);
        }

        //pop方法把栈顶的元素弹出
        this.pop = function () {
            return items.pop();
        }

        //top 方法返回栈顶元素
        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 = []
        }

    }


</script> 

使用栈类,并封装一个方法,解决我们问题1:

    function is_leagl_brackets(string) {
        var stack = new Stack();
        for (var i = 0; i < string.length; i++) {
            var item = string[i];
            if (item=="(") {
                stack.push(item);//将( 压入栈
            }
            else if (item == ")") {
                if (stack.isEmpty()) {//如果为空,说明没有(和他抵消,所以这个)是有问题的
                    return false;
                }
                else {
                    stack.pop();//将栈顶弹出  
                }
            }
        }
        return stack.size() == 0;//结束后如果个数没抵消为0,说明有问题
    }

 结果:

console.log(is_leagl_brackets("()()))"));//false
console.log(is_leagl_brackets("function(test(ww()))"));//ture
console.log(is_leagl_brackets("()()function(test())("));//false

原理是采用,先进后出的原理,使用()成对抵消,如果没能抵消,则说明校验不通过

ok!....问题2留个大家思考。

猜你喜欢

转载自www.cnblogs.com/Bruke/p/10754092.html