数据结构从入门到进阶(队列/栈)

60 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

玩转数据结构,从入门到进阶

栈stack

首先看一下栈的特点:

  • 栈是一种后进先出的数据结构也是一种线性结构
  • 相比数组,栈对应的操作是数组的子集
  • 只能从一端添加元素,也只能从一端取出元素(取元素只能取栈顶元素)
  • 这一端称为栈顶

栈在数据结构中,应用非常广泛。

栈的应用

栈的应用非常广泛,例如

  • 在很多编辑器中,都有一个 undo(撤销) 的操作,这便是我们最常见的栈应用。(程序员没了撤销可不能活),每次撤销,就会将栈顶元素取出,并进行相关操作
  • 程序调用的系统栈,比如在我们嵌套调用函数时,如下,我们在执行A的时候遇到B函数,会暂停A函数的执行并将其存储到系统栈中,进而执行B,同理存入B函数,执行C函数,C函数执行完后,就会看系统栈中的内容,找到还没有执行的B函数,B函数执行完后,执行A函数。然后系统栈为空。整个算是执行完了。概述:在编程时,进行子过程调用,当一个子过程执行完成,就可以回到上层调用中断的位置继续执行下去,用系统栈记录每次中断时的点
function A(){
    ...
    B()
    ...
}
​
function B(){
    ...
    C()
    ...
}
function C(){
    ...
    ...
    ...
}

栈的实现

js的实现过程

push

入栈

pop

出栈

getSize

获取栈的大小

peek

查看栈顶元素

isEmpty

栈是否为空

image-20220929145018377

js可以直接使用数组当作一个栈,数组方法比较多,很容易实现

栈相关算法

有效括号

image-20220929145116871

image-20220929152453707

这道题还是很简单的,主要用到了栈的知识,

遇到左括号时,将对应的右括号存入栈中;遇到右括号时,就看看栈顶元素是否和这个右括号相同。如果相同的话,这两个括号就匹配上了,相应的出栈后,接着对后面的字符串进行匹配。

删除字符串中的所有相邻重复项

image-20220929152752192

image-20220929155005660

两道非常简单的题。

后续补充......

队列Queue

队列的特点:

  • 栈是一种先进先出的数据结构也是一种线性结构
  • 相比数组,队列的操作是数组的子集
  • 只能从一端(队尾)添加元素,从一另端(队首)取出元素

普通队列的实现

队列在js中可以直接通过js的pushshift数组方法,进行构成。

循环队列

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

[循环队列讲解​]  leetcode.cn/problems/de… 

var MyCircularQueue = function (k) {
    this.capacity = k + 1;
    this.elements = new Array(this.capacity).fill(0);
    this.rear = 0;
    this.front = 0;
};
​
MyCircularQueue.prototype.enQueue = function (value) {
    if (this.isFull()) {
        return false;
    }
    this.elements[this.rear] = value;
    this.rear = (this.rear + 1) % this.capacity;
    return true;
};
​
MyCircularQueue.prototype.deQueue = function () {
    if (this.isEmpty()) {
        return false;
    }
    this.front = (this.front + 1) % this.capacity;
    return true;
};
​
MyCircularQueue.prototype.Front = function () {
    if (this.isEmpty()) {
        return -1;
    }
    return this.elements[this.front];
};
​
MyCircularQueue.prototype.Rear = function () {
    if (this.isEmpty()) {
        return -1;
    }
    return this.elements[(this.rear - 1 + this.capacity) % this.capacity];
};
​
MyCircularQueue.prototype.isEmpty = function () {
    return this.rear == this.front;
};
​
MyCircularQueue.prototype.isFull = function () {
    return ((this.rear + 1) % this.capacity) === this.front;
};
​

队列相关算法

算法题待补充......