一、写这个系列的缘由和计划前段时间遇到了一个如何取币的实际问题最佳。数学描述为求解多元线性方程的问题如下:1x+5y+10z+15k+20*j=16;一开始想着怎么解多元方程,又去解矩阵,结果越来越复杂。后来发现这和背包问题很像;然后我会重温一些算法和数据结构的知识,所以才有了这个系列。我的计划是把相关的数据结构一一介绍,并用JavaScript实现,然后是一些经典的应用和例子;话不多说,从最基础的开始:复杂度、栈、队列;2.复杂性说到算法和数据结构,无非就是要解决两个问题:1.如何更快更准确的得到预期的结果;2.如何占用尽可能少的资源,达到预期的效果;而这两个问题就是我们平时所说的性能问题,解决这两个问题就会解决大部分的性能问题;那么这两个问题如何衡量或者选择,至于两者,有时候两者是不相容的。要么为了占用更少的资源而牺牲时间的追求,要么为了更快的达到预期效果而牺牲一定的资源存储。这就涉及到了空间复杂度和时间复杂度空间复杂度:这是指我们计算机实现某个功能或方法所需要的内存资源。很多时候,内存资源可能不是首要优先级,只要能达到速度即可,比如sorting对于counting排序,会定义一个中间数组。数组的长度是待排序数组的最大值,这无疑需要更多的内存开销;时间复杂度:时间复杂度用大O表示,虽然我们不能用准确的从代码中计算执行时间也是不现实的,因为这个时间跟操作系统和硬件有关,所以我们一般有一个估计值来表示它;通俗一点就是看代码重复执行的次数O(n);O(1):在这种情况下,无论如何执行count方法,方法中的++n只会执行一次,不会随着参数n的增加而改变。这个时间复杂度是一个常数;函数计数(n){返回++n;}count(n);O(n):本例中,随着参数的变化,代码执行的次数呈线性变化;functionconsoleFn(n){for(leti=0;i得到我=log2n;函数consoleFn(n){让i=1;while(i{if(!str){返回假;}constdeque=newDeque();conststrs=str.toLowerCase().split('');for(leti=0;i1&&isTrue){start=deque.removeFront();end=deque.removeBack();如果(开始!=结束){isTrue=false;}}returnisTrue}console.log(palindromeChecked('adfds'));//falseconsole.log(palindromeChecked('adada'));//真正的思考:学习了队列和栈之后,如何使用队列和栈来实现一个四次算术运算,比如cal('1+2-3+6/3'),结果是2部分思考与回答判断标签是否关闭思路:1.分析字符串的标签2.创建一个标签栈。遇到起始标签时,将其压入栈中。当遇到一个关闭的标签时,将其从堆栈中弹出,如果为空,则表示关闭。如果还有标签,说明队列和栈不能关闭。更好的实施。我们上面栈和队列的实现都是使用数组来对数组进行删除和添加元素,而对数组的操作其实是比较消耗的。和其他静态语言一样,其实JavaScript对数组的操作是非常复杂的,但是js引擎帮我们做了这些事情,比如从数组头部删除或者添加一个元素。事实上,内部需要翻译数组的其他元素。比如插入一个元素数组,首先要增加长度,然后所有的元素都要向后移动一位,为头部腾出空间,然后再放入要添加的元素。因此,用对象来实现比用数组来实现更好。更好的出口定义aultclassQueue{constructor(){this.counter=0;//计数器计算队列大小this.items={};//队列存储this.lowestCount=0;//队头}//返回队头peek(){returnthis.items[this.lowestCount];}enqueue(element){this.items[this.counter]=element;这个。计数器++;}dequeue(){if(this.isEmpty()){返回未定义;}constresult=this.items[this.lowestCount];删除this.items[this.lowestCount];this.lowestCount++;返回结果;}isEmpty(){返回this.size()===0;}size(){returnthis.counter-this.lowestCount;}clear(){this.counter=0;this.lowestCount=0;this.items={};代币;2.获取代币进行处理。这时定义一个数栈和一个操作数栈。3.当遇到一个号码时,将该号码压入号码栈。当遇到操作符时,判断是否可以进行操作。从数栈中弹出2个数,再从运算符栈中弹出一个运算符,然后执行相应的运算,将运算结果压入数栈作为下一个操作数1+2-3+6/3=>tokens=['{类型:'数字r',value:'1'},{type:'operator',value:'+'},'{type:'number',value:'2'},{type:'operator',value:'-'},'{type:'number',value:'3'},{type:'operator',value:'+'},'{type:'number',value:'6'},{type:'operator',value:'/'},'{type:'number',value:'3'},]'相关源码实现地址源码点此获取第一手资料,请关注我的专栏或付费关注公众号