宝哥软件园

数据结构和算法(栈)每周一练习

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

最近公司开始分享前端技术的技术,每周一练每周一个主题,重点是基础知识。感觉很棒。跟随团队领导学习和复习一些知识,新人可以学到更多的知识,在团队内部营造学习氛围。

接下来我会开始整理每周一练习的题目和知识,方便思考和巩固,就像今天文章的开头一样。

学习的路很长,要坚持下去,希望每个人都能掌握自己喜欢的技术,掌握自己需要的技术。

本周练习内容:数据结构与算法—— Stack

这些都是数据结构和算法,有些是团队其他成员实现的,有些是我自己做的。如有其他实现方法或错误,欢迎大家提出建议。谢谢你。

1.stack的特点是什么,生活中有哪些例子?

Stack,也称为stack,是一个后进先出的有序集合,其中一端是stack的顶部,另一端是stack的底部。添加元素时(称为推/推或推),新元素被推入栈顶;删除元素时(称为推或推),会删除底部元素并返回删除的元素。特点:先进先出,后进先出。一叠书和盘子。

其次,实现堆栈并实现以下方法

Push(元素):在堆栈顶部添加一个新元素。Pop():移除堆栈顶部的元素并返回移除的元素。Peek():返回堆栈顶部的元素,不做任何修改(此方法不移除堆栈顶部的元素,只返回它)。IsEmpty():如果堆栈没有元素,则返回true,否则返回false。Clear():移除堆栈中的所有元素。Size():返回堆栈中元素的数量。此方法类似于数组的length属性。方法1: es6实现

class Stack { constructor(){ this . items=[]} push(element){ this . items . push(element)} pop(){ return this . items . pop()} peek(){ return this . items[this . items . length-1]} isEmpty(){ return this . items . length===0 } clear(){ this . items=[]} size(){ return this . items . length } }虽然上面的实现很简单,但内部items属性是公共的。为了满足面向对象成为私有的原则,我们应该将项目作为私有属性,所以我们可以使用ES6中的Symbol或WeakMap来实现它:

方法二:使用ES6的Symbol基础数据类型复习知识点:ES6中Symbol的介绍

const _ items=symbol()class stack { constructor(){ this[_ items]=[]} push(element){ this[_ items]。push(element)}//剩下的方法与第一个实现的方法类似。这里省略//只需将前面方法中的items改为这个[_items]}方法3:使用ES6的WeakMap实现

知识点回顾:在ES6中引入WeakMap

const items=new WeakMap()类Stack { constructor(){ items . set(this,[])} push(element){ let item=items . get(this)item。push(element)}//剩下的方法和第一个类似,这里省略//只需把前面方法中的this.items改为items即可。get (this) to get}第三,写一个函数实现十进制到二进制

标题的意思很简单,就是十进制到二进制。但是在实际工作和开发中,我们更愿意实现从任意到任意的转换。然而,我们仍然把解决问题作为我们的首要目标。

当然,toString(2)方法可以直接用于业务需求,但是为了实践,我们仍然不使用它。

方法1:使用前面定义的堆栈类

在此使用上一主题中定义的堆栈类。

/* * *十进制到二进制* @ param { number } bit */function bit set(bit){ if(bit==0)返回' 0' if(!/^[0-9] .[0-9] * $/.test(bit)){返回新错误('请输入正确的值!')}让stack=new Stack(),结果='' while(位0){ stack.push(位% 2) bit=Math.floor(位/2) } while(!堆叠。isempty ()) {result=stack。pop()。tostring ()}返回结果}方法2:简单实现

下面这个方法,其实不太好,因为没有怎么用到这次要练习的栈方法,哈哈。

/** * 十进制转换为二进制* @ param { Number }位*/功能位集(位){ if(位==0)返回' 0' if(!/^[0-9] .[0-9]*$/.测试(位)){返回新的错误('请输入正确的数值!')}让arr=[] while(位0){ arr.push(位% 2) bit=Math.floor(位/2) }返回arr.reverse().加入("")另外可以参考:wikiHow -从十进制转换为二进制。

四、编写一个函数,实现检验圆括号顺序的有效性

主要目的就是:该函数接收一个圆括号字符串,判断里面的括号顺序是否有效,如果有效则返回真实的反之假的。如:

(-false()-true(()-false())-false())-false(((((())))))-true这个题目实现的主要方法是:遍历字符串,先排除错误情况,然后将(入栈保存,将)入栈匹配前一个元素是否是(,如果是,则流行音乐()前一个元素(,如果不是,则推送()这个)入栈,最终查看栈是否为空,若是则检验成功,否则失败。

方法1:使用前面定义的堆类

这里使用前面题目中定义的堆类。

/** * 检验圆括号顺序的有效性* @ param { String } str */函数有效括号(str){ if(!str || str.length===0 || str[0]===')')返回错误的让Stack=new Stack(). str . split(').forEach(char={ let status=stack。peek()==='(' char==')'状态?堆栈。pop():堆栈。push(char)})返回stack.isEmpty()}方法2:出入栈操作

/** * 检验圆括号顺序的有效性* @ param { String } str */函数有效括号(str){ if(!str || str.length===0 || str[0]===')')返回false let arr=[]for(let I=0;我字符串长度;i ){ str[i]==='('?由…改编推送(字符串[1]): arr。pop()}返回arr。长度===0 }五、改造题二,添加一个部函数来获得栈中最小元素

步骤数据栈辅助栈最小值1 .推3 3 0 3 2 .推4 3,4 0,0 3 3 .推2 3,4,2 0,0,2 2 4 .推1 3,4,2,1 0,0,2,3 1 5.pop 3,4,2 0,0,2 2 6.pop 3,4 0,0 3 7.push 3,4,0 0,0 2 0使用示例如下:

让Stack=new Stack();堆栈。推(3);console.log('推送3后,Min项为,堆栈。min());堆栈。推动(4);console.log('推送四后,Min项为,堆栈。min());堆栈。推(2);console.log('推送2后,Min项为,堆栈。min());堆栈。推(1);console.log('推送一后,Min项为,堆栈。min());堆栈。pop();控制台。日志(' pop后,Min项为,堆栈。min());堆栈。pop();控制台。日志(' pop后,Min项为,堆栈。min());堆栈。push(0);console.log('推送0后,Min项为,堆栈。min());提示:利用辅助栈(网络端可利用数组),每次对栈推动/弹出元素时,也同时更新辅助栈(存储最小元素的位置)

方法1:小操作

类Stack { constructor(){ this。items=[];这个。minindex stack=[];}推送(元素){ this.items.push(元素);让minLen=这个。minindextstack。长度;让minItemIndex=this。minindex堆栈[minLen-1];if(minLen===0 | | this。items[minItemIndex]item){ this。minindextstack。推(这个。物品。长度-1);} else { this。minindextstack。push(minItemIndex);} } pop(){这个。minindextstack。pop();返回这个。物品。pop();} min(){让len=this。minindextack。长度;返回(len 0这个。物品[这个。minindex堆栈[len-1]])| | 0;} peek(){ 0返回这个。物品[这个。物品。长度-1];} //省略其它方法}方法2:与方法一中推实现的差异

类Stack { constructor(){ this。items=[]//数据栈this.arr=[] //辅助栈}推送(元素){ this.items.push(元素)让最小值=数学最小值(.这个。物品)这个。由…改编推送(最小值===元素?这个。size()-1 : 0)} pop(){ this。由…改编流行音乐()返回这个。物品。pop()} peek(){返回此。物品[这个。物品。length-1]} isEmpty(){返回此。物品。length===1 } clear(){ this。items=[]} size(){ return this。物品。length } min(){ let last=this。arr[这个。由…改编长度-1]返回this.items[last] }}以上所述是小编给大家介绍的数据结构与算法(堆栈)详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

更多资讯
游戏推荐
更多+