实现栈结构

//创建栈
function Stack (){
let items = [] this.push = function(element){
items.push(element)
}
this.pop = function(){
return items.pop()
}
this.peek = function(){
return items[items.length - 1]
}
this.isEmpty = function(){
return items.length === 0
}
this.size = function(){
return items.length
}
this.clear = function(){
items = []
}
this.print = function(){
console.log(items.toString())
}
}

ES6改造

//使用Symbol添加私有属性
class Stack {
let _items = Symbol()
constructor(){
this[_items] = []
}
push(element){
this[_items].push(element)
}
} //可以拿到所有的symbol对象
Object.getOwnPropertySymbols(Stack) //使用weakMap
const items = new weakMap() class Stack {
constructor(){
items.set(this,[])
}
push(element){
let s = items.get(this)
s.push(element)
}
pop(){
let s = items.get(this)
let r = s.pop()
return r
}
} //利用闭包实现私有属性
let Stack = (function(){
const items = new WeackMap() class Stack {
constructor(){
items.set(this,[])
}
push(element){
let s = items.get(this)
s.push(element)
}
pop(){
let s = items.get(this)
let r = s.pop()
return r
}
}
return Stack
})()

进制转换

//10进制转2进制
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()
}
} //任意进制转换
function baseConverter(decNumber,base){
const remStack = new Stack();
const digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let number = decNumber;
let rem;
let baseString = ''; if (!(base >= 2 && base <= 36)) {
return '';
} while (number > 0) {
rem = Math.floor(number % base);
remStack.push(rem);
number = Math.floor(number / base);
} while (!remStack.isEmpty()) {
baseString += digits[remStack.pop()];
} return baseString;
}

平衡圆括号

function balancedSymbols(symbols){
const stack = new Stack()
const opens = `([{`
const closers = `)]}` let balanced = true
let index = 0
let symbol
let top while(index < symbols.length && balanced){
symbol = symbols[index] if(opens.indexOf(symbol) >= 0){
stack.push(symbol)
} else if(stack.isEmpty()){
balanced = false
} else {
top = stack.pop()
if(!(opens.indexOf(top) === closers.indexOf(symbol))){
balanced = false
}
} index ++
}
return balanced && stack.isEmpty()
}

汉诺塔

递归,即定义一组基本操作,这组操作将规模小一点(或大一点)的操作当做一个整体——无需关心它的细节,只当它已经完成了——然后执行剩下的操作。而在更小或更大的规模中也依此操作,直到规模达到预定值。

function towerOfHanoi(plates,source,helper,dest,sourceName,helperName,destName,moves = []){
if(plates <= 0){
return moves
}
if(plates === 1){
dest.push(source.pop())
const move = {}
move[sourceName] = source.toString()
move[helperName] = helper.toString()
move[destName] = dest.toString()
moves.push(move)
}
else {
towerOfHanoi(
plates - 1,
source,
dest,
helper,
sourceName,
destName,
helperName,
moves
)
dest.push(source.pop())
const move = {}
move[sourceName] = source.toString()
move[helperName] = helper.toString()
move[destName] = dest.toString()
moves.push(move)
towerOfHanoi(
plates - 1,
helper,
source,
dest,
helperName,
sourceName,
destName,
moves
)
}
return moves
} function hanoiStack(plates){
const source = new Stack()
const dest = new Stack()
const helper = new Stack() for(let i = plates; i > 0; i --){
source.push(i)
} return towerOfHanoi(
plates,
source,
helper,
dest,
source,
helper,
dest
)
} function hanoi(plates,source,helper,dest,moves = []){
if(plates <= 0){
return moves
}
if(plates === 1){
moves.push([source,dest])
} else {
hanoi(
plates - 1,
source,
dest,
helper,
moves
)
moves.push([source,dest])
}
return moves
}
//用栈来实现汉诺塔
console.log(hanoiStack(3));
//用递归来来实现
console.log(hanoi(3, 'source', 'helper', 'dest'));

js实现栈结构的更多相关文章

  1. 原生JS实现栈结构

    1. 前言 栈,是一种遵从后进先出(LIFO,Later-In-First-Out)原则的有序集合.新添加的元素都保存在栈的一端,称作栈顶,另一端叫做栈底.在栈中,新元素都靠近栈顶,旧元素都靠近栈底. ...

  2. (js描述的)数据结构[栈结构](2)

    (js描述的)数据结构[栈结构](2) 一.什么是栈结构 1.一种受限制的线性结构,这种结构可以基于数组来实现. 2.可以抽象成一个容器,上面的是栈顶,底下的是栈底.所以仅允许对栈顶进行操作, 二.栈 ...

  3. JS数据结构与算法-栈结构

    一.认识栈结构 栈也是一种非常常见的数据结构,并且在程序中的应用非常广泛 数组 我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据. 但是有时候,我们为了实现某些功能,必须对这种任意性 ...

  4. 数据结构笔记--栈的总结及java数组实现简单栈结构

    杂谈"栈"结构: 栈(Stack)是一种插入删除操作都只能在一个位置上进表,这个位置位于表的末端,叫做栈顶(Top). 对栈的基本操作有push和pop,表示进栈和出栈.也就相当于 ...

  5. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换

    Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...

  6. javascript使用栈结构将中缀表达式转换为后缀表达式并计算值

    1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...

  7. javascript中的栈结构

    1.栈的定义 栈是一种和列表类似的数据结构,可以用它来解决很多的编程问题,栈是一种高效的数据结构,因为数据只能在栈的顶端添加或者删除,所以这样的操作很快而且容易实现. 栈是一种特殊的列表,站内的元素只 ...

  8. 用C++类模板实现栈结构出现的问题以及思考

    C++中使用了模板来减少方法相同但是类型不一样带来的函数重载以及大量复制代码的问题.这里主要说说类模板   类模板的定义:   template<TYPENAME Type>   clas ...

  9. 用Java实现栈结构

    栈是一种先进后出的数据结构,出栈入栈都是操作的栈顶元素,下面是利用Java语言实现的一个简单的栈结构 class MyStack{ private int size;//栈大小 private Obj ...

随机推荐

  1. [ActionScript 3.0] 模拟win7彩色气泡屏保效果

    主文件: package { import com.views.BubbleView; import com.views.ColorfulBubble; import flash.display.Sp ...

  2. 【bug】—— IE8 ajax 报错:no transport

    如题,我使用$.ajax()方法请求数据,在现代浏览器中工作正常,但在 IE 8 下,会有报错:no transport 从 stackoverflow 中获知,出现这个问题是因为** IE 8 不支 ...

  3. javascript举例介绍事件委托的典型使用场景

    在了解什么是DOM事件以及给DOM事件绑定监听器的几种方法后,我们来谈谈事件委托. 1. e.target 和 e.currentTarget 当我们给目标元素target 绑定一个事件监听器targ ...

  4. uml地址栏参数特殊字符处理

    转义方法: function URLencode(sStr) { return escape(sStr).replace(/\+/g, '%2B').replace(/\"/g,'%22') ...

  5. Vue 不睡觉教程2 - 洋气的文件结构

    目标书接上回,上回那个例子实在太土了.实际开发中我们不可能把整个网站的js和html全写到一个页面上.所以我们这节课的目标在于改造这个例子的文件结构,让它不那么土Let's do it 环境参数vue ...

  6. 最新版chrome浏览器如何离线安装crx插件?(转载)

    原文链接:https://newsn.net/say/chrome-crx-offline.html mac新版chrome开启离线插件安装 对于mac新版chrome,注意,大家一定要按照顺序来.m ...

  7. 【笔记】AJAX+SweetAlert插件实现删除操作

    [笔记]AJAX+SweetAlert插件实现删除操作 Django AJAX SweetAlert  展示 SweetAlert 插件介绍 SweetAlert 是一个 JS 插件,能够完美替代 J ...

  8. 【算法笔记】A1060 Are They Equal

    1060 Are They Equal (25 分)   If a machine can save only 3 significant digits, the float numbers 1230 ...

  9. 一些很好用但不常用的css属性总结 (持续中......)

    在各种框架横行的9012,感觉我们学前端的都变得浮躁了很多,放一张最近流行的神图: 唉,扯远了, 还是整理我的东西吧,路漫漫其修远兮,吾将上下而求索! 1, position:sticky; 粘性定位 ...

  10. 一段自用javascript代码

    function jsontoarray(mjson) { var arr = []; ; for(var x in mjson.data){ arr[i] = new Array(); arr[i] ...