前言:我们所接触的数据结构有:栈,队列,链表,哈希等;
经常用,但可能没深入了解其原理。以下是我的读书笔记;
借一下图:
栈的结构,好像是一个桶,先放进去的,就垫底,后放进去的在上面。只能从上面拿,所以有先进后出、后进先出的性质。
比如:
定义的规则是: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留个大家思考。