当前位置: 首页 > Web前端 > JavaScript

算法介绍及简单练习——栈

时间:2023-03-26 22:56:29 JavaScript

Stack什么是栈先进先出(LIFO)常用方法push向栈顶添加一个元素pop弹出栈顶元素topreturns栈顶元素isEmpty判断是否为空size返回栈中元素个数clear清空栈实现栈函数Stack(){constitems=[]//添加元素from栈顶,压栈this.push=function(item){items.push(item)}//Popthis.pop=function(){return!this.isEmpty()&&items.pop()}//返回栈顶元素this.top=function(){return!this.isEmpty()&&items[items.length-1]}//判断是否为空this.isEmpty=function(){returnitems.length===0}//返回栈中的大小this.size=function(){returnitems.length}//清除栈this.clear=function(){items.length=0}}Simple练习1.判断括号是否合法遍历字符串的思路,遇到(时,在栈中添加一个标记,表示这是第一个一对括号的开头。当遇到)时,我们从堆栈中取出一个令牌,表示括号是一个集合。中间如果遇到)不能pop,说明缺少(。直接返回false。遍历后,我们判断栈的长度。如果栈为空,则说明括号全部偏移,返回true.如果长度不为0,表示缺失)。返回假。代码实现conststr1='(12)(323)()123(1))'conststr2='()(123123)'functionisLegal(str){constitems=newStack()for(leti=0;i=0){constvalue1=stack.pop()constvalue2=堆栈。pop()常量expStr=value2+item+value1stack.push(parseInt(eval(expStr)).toString())}else{stack.push(item)}}returnstack.pop()}console.log(calcExp(exp1))console.log(calcExp(exp2))3.用min方法实现一个堆栈。实现一个堆栈。除了常见的push和pop方法外,还提供了min方法,用于返回栈中的最小值。要求时间复杂度为O(1),定义两个栈,一个用于正常存储数据和操作,以下简称栈。另一个将每次push的最小值入栈,以下简称minstack。每次push的时候,值都会正常的加入到栈中。我们判断在minstack中,如果为空或者minstack栈顶的数据大于加入的值,那么我们就入栈。此时min栈顶就是本次操作中的最小值。每次发生pop,stack和minstack都能正常运行。最小堆栈在一个元素之后弹出堆栈的顶部。因为我们每次push的时候,都会把state的最小值push到min栈中。此时栈顶的值仍然是栈中的最小值。代码实现functionMinStack(){conststack=newStack()constminStack=newStack()this.push=function(item){stack.push(item)if(minStack.isEmpty()||minStack.top()>item){minStack.push(item)}else{minStack.push(minStack.top())}}this.pop=function(){if(stack.isEmpty())returnfalsestack.pop()minStack.pop()}this.min=function(){returnminStack.top()}}constminStack=newMinStack()minStack.push(3)//[3]console.log(minStack.min())//3minStack.push(2)//[3,2]console.log(minStack.min())//2minStack.push(5)//[3,2,5]console.log(minStack.min())//2minStack.push(-1)//[3,2,5,-1]console.log(minStack.min())//-1minStack.pop()//[3,2,5]minStack。pop()//[3,2]minStack.pop()//[3]console.log(minStack.min())//3//3//2//2//-1//34,将中序表达式转换为后缀表达式的思想定义了一个栈和一个列表数组。循环表达式元素。如果是数字,则直接添加到列表中。如果是左括号,则将其压入堆栈。如果是右括号,则循环栈元素,依次将栈顶元素弹出到链表中,直到遇到左括号结束循环。并弹出左括号。如果是运算符,则判断此时的栈是否为空栈。如果栈为空,则直接将运算符添加到空栈中。如果栈不为空,循环栈,弹出栈顶优先级大于或等于当前算子的算子,加入链表。直到找到优先级低于当前运算符的运算符。将当前运算符压入堆栈。循环结束后,栈中剩余的元素将从栈顶弹出,加入到链表中。并返回结果列表。代码实现constpriorityMap={'+':1,'-':1,'*':2,'/':2}functioninfixExpToPostfixExp(exp){conststack=newStack()constlist=[]for(leti=0;i=priorityMap[item]){list.push(stack.pop())}stack.push(item)}}while(!stack.isEmpty()){list.push(stack.pop())}返回list}consttest1=['12','+','3']//12+3consttest2=['2','-','3','+','2']//2-3+2consttest3=['(','1','+','(','4','+','5','+','3',')','-','3',')','+','(','9','+','8',')']//(1+(4+5+3)-3)+(9+8)console.log(信息ixExpToPostfixExp(test1))console.log(infixExpToPostfixExp(test2))console.log(infixExpToPostfixExp(test3))