数据结构-栈/队列

在上一篇文章中我们用ts实现了一个双向链表的功能

在这篇文章中,我们使用ts来实现一个栈结构和队列结构

栈结构

  • 特点 :一种后进先出的操作受限的线性表。只允许在一端(栈顶)进行插入(入栈/Push)和删除(出栈/Pop)操作。
  • 场景:函数调用栈、表达式求值、括号匹配、浏览器前进/后退功能。

对于栈结构里面的元素储存,我们可以使用一个数组来表示

ts 复制代码
class Stack<T> {
  private items: T[];

  constructor() {
    this.items = [];
  }
}

接下来设计栈结构的方法

  1. push(item: T) - 将元素添加到栈顶
  2. pop(): T | undefined - 移除并返回栈顶元素
  3. peek(): T | undefined - 查看栈顶元素而不移除它
  4. isEmpty(): boolean - 检查栈是否为空
  5. size(): number - 获取栈中元素数量
  6. clear(): void - 清空栈
  7. toString(): string - 将栈内容转换为字符串

栈结构代码实现

添加元素

ts 复制代码
  /**
   * 将元素压入栈顶
   * @param item 要添加的元素
   */
  push(item: T): void {
    this.items.push(item);
  }

获取栈顶元素

ts 复制代码
  /**
   * 弹出栈顶元素
   * @returns 栈顶元素或undefined(如果栈为空)
   */
  pop(): T | undefined {
    return this.items.pop();
  }

查看栈顶元素

ts 复制代码
  /**
   * 查看栈顶元素而不移除它
   * @returns 栈顶元素或undefined(如果栈为空)
   */
  peek(): T | undefined {
    return this.items[this.items.length - 1];
  }

其他功能函数

ts 复制代码
  /**
   * 检查栈是否为空
   * @returns 如果栈为空返回true,否则返回false
   */
  isEmpty(): boolean {
    return this.items.length === 0;
  }

  /**
   * 返回栈的大小
   * @returns 栈中元素的数量
   */
  size(): number {
    return this.items.length;
  }

  /**
   * 清空栈
   */
  clear(): void {
    this.items = [];
  }

  /**
   * 将栈转换为字符串
   * @returns 栈的字符串表示
   */
  toString(): string {
    return this.items.toString();
  }

队列结构

  • 特点 :一种先进先出的操作受限的线性表。只允许在一端(队尾)进行插入(入队/Enqueue),在另一端(队头)进行删除(出队/Dequeue)。

  • 常见变种

    • 双端队列:两端都允许进行插入和删除操作。
    • 优先队列 :出队顺序由元素的"优先级"决定,通常用来实现。
  • 场景:任务调度、消息队列、广度优先搜索(BFS)。

和栈结构类似,对于队列结构里面的元素储存,我们也是使用一个数组来表示

ts 复制代码
class Queue<T> {
  private items: T[];

  constructor() {
    this.items = [];
  }
}

队列内部所包含的方法如下

  1. enqueue(item: T) - 将元素添加到队列末尾
  2. dequeue(): T | undefined - 移除并返回队列的第一个元素
  3. peek(): T | undefined - 查看队列的第一个元素而不移除它
  4. isEmpty(): boolean - 检查队列是否为空
  5. size(): number - 获取队列中元素数量
  6. clear(): void - 清空队列
  7. toString(): string - 将队列内容转换为字符串

队列结构代码实现

添加元素

ts 复制代码
  /**
   * 将元素添加到队列末尾
   * @param item 要添加的元素
   */
  enqueue(item: T): void {
    this.items.push(item);
  }

获取元素

ts 复制代码
  /**
   * 移除并返回队列的第一个元素
   * @returns 队列的第一个元素或undefined(如果队列为空)
   */
  dequeue(): T | undefined {
    return this.items.shift();
  }

查看首个元素

ts 复制代码
  /**
   * 查看队列的第一个元素而不移除它
   * @returns 队列的第一个元素或undefined(如果队列为空)
   */
  peek(): T | undefined {
    return this.items[0];
  }

其他功能函数

ts 复制代码
/**
   * 检查队列是否为空
   * @returns 如果队列为空返回true,否则返回false
   */
  isEmpty(): boolean {
    return this.items.length === 0;
  }

  /**
   * 返回队列的大小
   * @returns 队列中元素的数量
   */
  size(): number {
    return this.items.length;
  }

  /**
   * 清空队列
   */
  clear(): void {
    this.items = [];
  }

  /**
   * 将队列转换为字符串
   * @returns 队列的字符串表示
   */
  toString(): string {
    return this.items.toString();
  }
相关推荐
dtq0424几秒前
C语言刷题数组5,6(求平均值,求最大值)
c语言·数据结构·算法
洛水水1 小时前
【力扣100题】81.寻找两个正序数组的中位数
数据结构·算法·leetcode
Coder-magician2 小时前
《代码随想录》刷题打卡day15:二叉树part05
数据结构·c++·算法
Darling噜啦啦2 小时前
二叉树与递归算法实战:从树结构到 LeetCode 爬楼梯,一文吃透前端数据结构与递归思维
前端·javascript·数据结构
Irissgwe2 小时前
算法的时间复杂度和空间复杂度
数据结构·c++·算法·c·时间复杂度·空间复杂度
qq_297574673 小时前
设计模式系列文章(基础篇第22篇):访问者模式——分离数据结构与操作,实现灵活扩展
数据结构·设计模式·访问者模式
云淡风轻~窗明几净3 小时前
角谷猜想的任意算法测试
数据结构·人工智能·算法
代码中介商3 小时前
关键路径解析:项目管理的工期奥秘
数据结构
love_muming3 小时前
链表每日一练
java·开发语言·数据结构·链表·idea·每日一练
玖玥拾4 小时前
C/C++ 数据结构(二)双向链表
c语言·数据结构·c++