queue前面的数据结构讲了栈,队列和栈很像。队列也是一个特殊的列表。它和栈的区别在于栈是先进先出的,而队列遵循FIFO先进先出的原则。也就是说,队列只能在队尾插入元素,到队头去。删除元素。举个简单的例子,排队就相当于生活中排队买东西。后来的人需要排在队尾,排在前面的人结账一次后出去。队列应用广泛,常用于实现缓冲区、广度优先搜索、优先级队列等。队列的两个主要操作是入队(enqueue)和出队(exit)。从上图可以看出队列的实现逻辑。队列的几个特性被初始化,并且有一个连续的空间用于存储队列。head指向第一个数据的地址,tail指向数据后面的一个地址空间队列内部数据长度的大小classQueue{constructor(max=1000){//定义一个连续的存储空间,用于存储数据this.data=新数组(1000);//开辟空间的大小this.max=max;//头部位置this.head=0;//尾部位置this.tail=0;//数据长度this.size=0;}}enqueue入队当数据长度超过空位大小时,会报溢出错误。将新数据添加到最后。enqueueoperation)enqueue(x){//溢出if(this.size===this.max){throw'overflow'}//添加新数据到尾部this.data[this.tail]=x;//数据长度+1this.size++;//tail指针后移一位,如果后面没有空格,则指向0if(this.tail===this.max-1){this.tail=0;}else{这个如果(this.size===0){抛出'下溢';}constx=this.data[this.head];这个头++;这个.size--;返回x;}整个代码classQueue{constructor(max=1000){this.data=newArray(max);这个.max=max;这个.head=0;这个.tail=0;这个.size=0;}//入队enqueue(x){if(this.size===this.max){throw'overflow';}this.data[this.tail]=x;这个.size++;如果(this.tail===this.max-1){this.tail=0;}else{this.tail++;}}//dequeue(){if(this.size===0){throw'underflow';}constx=this.data[this.head];这。头++;这个.size--;返回x;}getlength(){returnthis.size;}}module.exports=队列;extension--stack实现queue队列也可以通过两个栈来实现,对栈不了解的同学可以看一篇关于栈的文章,接下来会介绍之前写的栈,具体代码见下面//上一节栈的实现代码constStack=require('./stack');classQueue{constructor(max=1000){//实例化两个栈,分别是s1和s2,s1栈用于入队,s2栈用于出队usethis.s1=newStack(max);this.s2=newStack(max);这个.max=max;}//enqueue(x){if(this.s1.length===this.max){throw'overflow'}//s1入队为this.s1.push(x);}//dequeue(){if(this.s2.length>0){returnthis.s2.pop;}while(this.s1.length){this.s2.push(this.s1.pop());}返回this.s2.pop();}}这里简单说明下使用两个栈实现队列的逻辑。栈s1入栈后,假设数据为1,2,3,4,5,入队遵循先进先出,所以出队的顺序应该是1,2,3,4,5,那么我们看看如何使用栈s2Pop。首先,栈s1pop()出栈后的数据为5,4,3,2,1。反过来,我们使用循环将栈s1中的数据push到栈s2中,堆栈s2中的数据将为5、4、3、2、1。接下来我们在执行s2.pop()的时候,是不是可以只依次获取1、2、3、4、5的数据呢?下一个数据结构给大家介绍一下链表
