js版数据结构_02队列

js版数据结构_02队列

代码均经过测试,但小白太白难免不足

在本篇博文你可以了解到

  • 队列是什么东西
  • 双端队列

队列和栈是十分相似的,只不过栈的特点是先进后出,而队列的是先进先出

1 队列是什么

在这里插入图片描述
队列是遵循先进先出(FIFO)原则的一组有序的项,它的操作可以在两端进行。即:队尾进,对头出

写在前面: 未完善哦,像私有成员变量的这种仿照第一节。毕竟我们要先学会思想

创建这个队列的类吧

        class Queue{
            constructor(){
                this.count=0;//用于记录队列内的元素个数
                this.lowesCount=0;//用于追踪对头元素
                this.items={};//用于存储队列元素的数据结构,当然也可以使用数组,但是使用对象获取元素更加高效
            }
        }

我们要实现的方法:

  • enqueue(e)向队尾添加元素
  • dequeue() 从对头出去一个元素
  • peek()返回队列中的第一个元素,也即:返回对头元素
  • isEmpty()判空
  • size()返回队列中元素的个数
  • clear() 清空

判空
ps:指针的作用就是指向了我们所需要的那块内存的元素,不要拘泥于c中的指针结构。它就是一个方便我们拿取东西的玩意儿

isEmpty() {
                // 什么时候为空呢,这里希望你有写c的数据结构的基础,为空时队头队尾指针指向同一地方
                return this.count === this.lowesCount;
            }

入队出队:

			enqueue(e) {
                this.items[this.count] = e;
                this.count++
            }
            dequeue() {
                // 先判非空
                if (this.isEmpty()) {
                    return undefined;
                } else {
                    const result = this.items[this.lowesCount];
                    delete this.items[this.lowesCount];
                    // 指针后移
                    this.lowesCount++;
                    return result;
                }
            }

其他三个

      	  peek() {
                // 先判空
                if (this.isEmpty()) {
                    return undefined;
                } else {
                    return this.count[this.lowesCount];
                }

            }
            size(){
                // 你要搞清楚有元素时这个this.count是指向的队尾的后一个,放的时候可是先放,再让它加的1
                return this.count-this.lowesCount;
            }
            clear(){
                this.items={};
                this.count=0;
                this.lowesCount=0;
            }

2 双端队列

在这里插入图片描述
什么是双端队列呢:即我们也希望在队头添加元素,队尾移出元素。
拿生活举栗子吧:
排队买东西时,队头的人买完之后忘记拿东西,就可以直接回到队头的位置去取。同样队尾的人等的不耐烦了,也可以离开

在计算机科学中,双端队列的一个常见应用是存储一系列的撤销操作。每当用户在软件中进
行了一个操作,该操作会被存在一个双端队列中(就像在一个栈里)。当用户点击撤销按钮时,
该操作会被从双端队列中弹出,表示它被从后面移除了。在进行了预先定义的一定数量的操作后,
最先进行的操作会被从双端队列的前端移除。由于双端队列同时遵守了先进先出和后进先出原
则,可以说它是把队列和栈相结合的一种数据结构

实操

创建这个类

class Deque { 
 constructor() { 
 this.count = 0; 
 this.lowestCount = 0; 
 this.items = {}; 
 } 
}

同样我们要实现以下功能:

  • isEmpty
  • clear
  • size
  • addFront(e) 队头添加元素
  • addBack(e) 队尾添加元素
  • removeFront 队头移出元素
  • removeBack 队尾移出元素
  • peekFront 取队头元素
  • peekBack 取队尾元素

实现代码(主要代码)

队头出队尾进,上面我们已经写好了。只需改个名字就行

            addFront(e) {
                if (this.isEmpty()) {
                    this.addBack(e)
                } else {
                    // 搞清楚现在谁指着队头呢
                    this.lowesCount--;
                    this.items[this.lowesCount] = e;
                }

            }
            addBack(e) {
                this.items[this.count] = e;
                this.count++
            }
            removeFront() {
                // 先判非空
                if (this.isEmpty()) {
                    return undefined;
                } else {
                    const result = this.items[this.lowesCount];
                    delete this.items[this.lowesCount];
                    // 指针后移
                    this.lowesCount++;
                    return result;
                }
            }
            removeBack() {
                if (this.isEmpty()) {
                    return undefined;
                } else {
                    // 谁指向队尾呢,this.count指向的是队尾的下一个
                    let result = this.items[this.count - 1];
                    delete this.items[this.count - 1];
                    this.count--;
                    return result;
                }
发布了68 篇原创文章 · 获赞 82 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41086511/article/details/105299707