宝哥软件园

JS中算法和数据结构的堆栈示例的详细说明

编辑:宝哥软件园 来源:互联网 时间:2021-08-20

本文通过实例描述了JS中算法和数据结构的栈。分享给大家参考,如下:

一叠

在上一篇文章中,我们谈到了列表,这是组织数据最自然的方式。如果数据的存储顺序不重要,那么list就是一个非常适合的数据结构。但是,对于其他计算机应用(比如后缀表达式),list似乎无能为力。因此,我们需要一个类似于list但更复杂的数据结构。栈,也叫Stack,是一种类似于list的数据结构,但是效率更高,因为栈中的元素只能通过list的一端来访问,叫做栈顶,数据只能在栈顶进行添加或删除。它遵循后进先出的原则,广泛应用于计算机的各个方面。堆栈上有两个主要操作,一个是将元素推入堆栈,另一个是将顶部元素弹出堆栈。此外,栈还有其他属性和方法:要查看栈顶的元素值,我们使用peek方法,只返回栈顶的元素值,不删除;Clear方法用于清除当前堆栈中的所有元素;Top属性记录当前栈顶位置;length方法返回当前堆栈中元素的总数;然后定义栈的数据类型,用JS中的数组来实现。

堆栈数据类型定义

栈的实现

//定义堆栈函数stack(){ this . datastore=[];//初始化为null this . top=0;//记录栈顶位置this.pop=pop//stack this . push=push;//stack this . peek=peek;//检查栈顶元素this.length=length//检查堆栈中元素的总数this.clear=clear//清空堆栈}我们使用dataStore保存堆栈中的元素,并将其初始化为一个空数组。top属性用于记录当前栈顶位置,初始化时间为0。

指示对应于堆栈顶部的数组的起始位置为0。如果堆栈上有一个元素,属性将反向变化。

首先,让我们实现第一种堆叠方法。

推送:将新元素压入堆栈

//这个方法在栈上放一个新元素,放在数组中与top对应的位置,top的值加1,这样就指向数组的下一个空位置:function push (element) {this。数据存储[这个。top]=元素;}如果你能堆叠,你必须能堆叠。然后我们将看到堆栈方法:

取出栈顶元素

//与堆栈相反,此方法返回堆栈的顶部元素,并用1函数pop(){ return this . datastore[-this . top]}减去top的值;}如何查看栈顶元素,peek方法!

查看:查看堆栈顶部元素

//方法返回栈顶元素,即top-1位置元素functionpeek () {if (this.top0)返回this . datastore[this . top-1];否则返回“空”;}我在这里做了一个判断。如果一个空栈调用peek方法,因为栈中没有元素,我在这里返回一个‘空’;现在,我们有了堆叠、堆叠和查看顶部元素的基本方法,不妨试一试。

//初始化堆栈var Stack=new Stack();console . log(stack . peek());//空//stack . push(' Apple ');stack . push(' Banana ');stack . push(' Pear ');//检查当前栈顶元素console . log(stack . peek());//Pearconsole . log(stack . pop());//梨如果我放了一些水果,吃了一个,我想知道我还剩下多少水果。长度方法可以实现

长度:返回堆栈中元素的总数

//此方法通过返回top属性function length(){ returnthis . top }的值来返回堆栈中的元素总数;}我们先把代码还原到栈前的状态,也就是已经放了三个水果在里面,接下来我们来看看

console . log(stack . length());//3//stack . pop();console . log(stack . length());//2好了,我们还剩一个明确的方法,让我们来实现它。

清除:清除堆栈

//这个方法的实现非常简单。让我们将顶部的值设置为0,并清空dataStore值,然后我们可以让函数clear () {delete this。数据存储;this . DATASE=[];this . top=0;}让我们尝试清空上面的堆栈

stack . clear();console . log(stack . length());//0 console . log(stack . peek());//空此时,我们可以用JS实现一个栈,但是你可能还处于不知道如何正确使用的状态。接下来,让我们举两个例子一起看看stack的用法。

案例一:实现数制之间的相互转换

我们可以使用stack将一个数字从一个数字系统转换成另一个数字系统。例如,要将数字n转换为基于b的数字,可以采用以下算法(该算法仅适用于基数为2-9的情况):

最高位为n% b,直接推入堆栈;用n/b代替n;重复以上步骤,知道n为0,没有余数;这样,堆栈中的元素会弹出,直到堆栈为空,这些元素会依次排列,以获得转换后的表单

代码如下:

//二进制转换(2-9)函数mulbase (num,base){ var s=newstack();do { s . push(num % base);num=math . floor(num/=base);} while(num 0);var已转换=' ';while(s . length)(0){ converted=s . pop();}返回已转换的;}console.log(mulBase(125,2));//1111101 console . log(mulBase(125,8));//175框2:判断一个字符串是否是回文

回文指的是字符串。从前到后写和从后到前写的结果是一样的。比如‘level’和‘race car’这两个字是回文,数字1001也是回文。我们可以很容易的用栈来判断一个字符串是否是回文,算法也很简单,相信大家已经猜到了。我们将字符串从左到右依次推入栈中,使字符串的反转字符保存在栈中,然后依次弹出栈,通过比较弹出的字符串是否与原字符串相等,可以判断该字符串是否为回文。具体代码实现如下:

//回文判断函数是回文(word){ var s=newstack();for(var I=0;I .字长;I){ s . push(word[I]);} var rword=while(s . length)(0){ rword=s . pop();} if(word==rword){ return true;} else { return false} } console . log(ispalindome(' level ')//true console . log(ispalindome(' 1001 ')//true console . log(ispalindome(' word ')//false本文主要讲栈的应用,所以我们用上面的方法来判断一个字符串是否是回文。事实上,

函数isPalindrome(单词){ return String(单词)。拆分(“”)。反转()。join(')==word?真:假;}至此,栈的内容基本已经告一段落。希望你们能有所收获,一起加油~

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun来测试上述代码的运行效果。

更多对JavaScript相关内容感兴趣的读者可以查看本网站专题:《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript数组操作技巧总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript错误与调试技巧总结》和0103010

希望本文对JavaScript编程有所帮助。

更多资讯
游戏推荐
更多+