学习JavaScript数据结构与算法(二)——栈
来源:互联网 发布:装网络摄像头怎么安装 编辑:程序博客网 时间:2024/06/06 02:46
栈是一种遵从后进先出(LIFO)原则的有序集合。
新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端叫做栈底。
在栈里,新元素靠近栈顶,旧元素接近栈底。
在现实生活中也有很多栈的例子,比如餐厅里堆放的盘子,最先放的盘子在最底下,最后放的盘子在最上面。
一、栈的创建
function Stack () { //创建一个数组,保存栈里的元素 var items = []; /*声明一些方法*/ /* push(element(s)) 添加一个或几个新元素到栈顶 */ this.push = function(element){ items.push(element); }; /* pop() 移除栈顶的元素,同时返回被移除的元素 */ this.pop = function(){ return items.pop(); }; /* peek() 返回栈顶的元素,不对栈做任何修改 不会移除栈顶的元素,仅仅返回它 */ this.peek = function(){ return items[items.length-1]; }; /* isEmpty() 如果栈里没有任何元素就返回true,否则返回false */ this.isEmpty = function(){ return items.length == 0; }; /* size() 返回栈里的元素个数 和数组的length属性类似 */ this.size = function(){ return items.length; }; /* clear() 移除栈里的所有元素 */ this.clear = function(){ items = []; }; /* print() 辅助方法,将栈里的元素输出到控制台 */ this.print = function(){ console.log(items.toString()); };}
二、使用Stack类
//初始化Stack类var stack = new Stack();//验证栈是否为空console.log(stack.isEmpty()); //输出为true//向栈里添加元素stack.push(5);stack.push(6);console.log(stack.peek()); //输出6stack.push(11);console.log(stack.size()); //输出3console.log(stack.isEmpty()); //输出为false//从栈里移除两个元素stack.pop();stack.pop();console.log(stack.size()); //输出1stack.print(); //输出5
三、应用实例
1、进制转换
1)从十进制到二进制
function divideBy2 (decNumber) { var remStack = new Stack(), rem, binaryString = ''; while (decNumber > 0) { rem = Math.floor(decNumber % 2); remStack.push(rem); decNumber = Math.floor(decNumber / 2); } while (!remStack.isEmpty()) { binaryString += remStack.pop().toString(); } return binaryString;}
2)从十进制到任意进制
function baseConverter (decNumber, base) { var remStack = new Stack(), rem, baseString = '', digits = '0123456789ABCDEF'; while (decNumber > 0) { rem = Math.floor(decNumber % base); remStack.push(rem); decNumber = Math.floor(decNumber / base); } while (!remStack.isEmpty()) { baseString += digits[remStack.pop()]; } return baseString;}
2、平衡圆括号
function parenthesesChecker (symbols) { let stack = new Stack(), balanced = true, index = 0, symbol, top, opens = "([{", closers = ")]}"; while (index < symbols.length && balanced){ symbol = symbols.charAt(index); if (opens.indexOf(symbol) >= 0){ stack.push(symbol); console.log(`open symbol - stacking ${symbol}`); } else { console.log(`close symbol ${symbol}`); if (stack.isEmpty()){ balanced = false; console.log('Stack is empty, no more symbols to pop and compare'); } else { top = stack.pop(); if (!(opens.indexOf(top) === closers.indexOf(symbol))) { balanced = false; console.log(`poping symbol ${top} - is not a match compared to ${symbol}`); } else { console.log(`poping symbol ${top} - is is a match compared to ${symbol}`); } } } index++; } if (balanced && stack.isEmpty()){ return true; } return false;}
3、汉诺塔
function towerOfHanoi(n, from, to, helper){ if (n > 0){ towerOfHanoi(n-1, from, helper, to); to.push(from.pop()); console.log('-----'); console.log('Disk: ' + n); console.log('Source: '); from.print(); console.log('Destination: '); to.print(); console.log('Helper: '); helper.print(); towerOfHanoi(n-1, helper, to, from); }}var source = new Stack();source.push(3);source.push(2);source.push(1);var dest = new Stack();var helper = new Stack();towerOfHanoi(source.size(), source, dest, helper);
【注】关于print()方法需要注意一点,该方法中已经包含了console.log()方法,直接使用就可以在控制台上打印输出。
【补充】
function towerOfHanoi(n, from, to, helper){ if (n > 0){ towerOfHanoi(n-1, from, helper, to); console.log('移动盘子 ' + n + ' 从 ' + from + ' 到 ' + to); towerOfHanoi(n-1, helper, to, from); }}towerOfHanoi(3, 'A', 'B', 'C');
阅读全文
0 0
- 学习JavaScript数据结构与算法(二)——栈
- 学习Javascript数据结构与算法系列笔记(二):栈
- 学习JavaScript数据结构与算法(七)——散列表(二)
- 前端学习总结(二十二)——常见数据结构与算法javascript实现
- 学习JavaScript数据结构与算法(一)——数组
- 学习JavaScript数据结构与算法(三)——队列
- 学习JavaScript数据结构与算法(四)——链表
- 学习JavaScript数据结构与算法(五)——集合
- 学习JavaScript数据结构与算法(六)——字典
- 学习JavaScript数据结构与算法(一):栈与队列
- 数据结构与算法(11)——栈习题二
- 算法与数据结构学习二
- 数据结构与算法javascript描述(二) 优先队列实例
- 数据结构与算法Javascript描述(二)队列
- JavaScript 版数据结构与算法(二)队列
- 数据结构与算法JavaScript (二) :队列
- 学习javascript数据结构(二)——链表
- 学习JavaScript数据结构与算法(七)——散列表(一)
- analytical model、numerical model 和 empirical model 三者的区别
- 图的基础
- 在centos6.5上安装Django1.7.11笔记
- poj3684:Physics Experiment
- 数据结构:定长顺序表
- 学习JavaScript数据结构与算法(二)——栈
- Vistual Studio 快捷键
- C/C++经典程序训练3---模拟计算器
- C++三大特性之一继承
- jsp实现登录功能并且将数据传到数据库
- 冒泡排序
- Unity_DOTween动画的学习(十一)_DOTweenPath路径编辑器的使用补充_结合按钮触发不同点击事件控制播放状态_Waypoints
- Java 并发 ---ReentrantLock源码分析
- IllegalStateException: Fragment null must be a public static class to be properly recreated from ins