数据结构-栈/队列

在上一篇文章中我们用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();
  }
相关推荐
wuyk55524 分钟前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
-dzk-27 分钟前
【链表】LC 138.随机链表的复制
数据结构·链表
洋不写bug1 小时前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
白狐_7982 小时前
408 数据结构|外部排序:流程与 k 路归并
数据结构·算法
我不会起名字3224 小时前
一天一道算法题(26):栈的简单应用
java·数据结构·python·算法·leetcode·golang·
不会就选b5 小时前
算法日常・每日刷题--<贪心+大根堆>2
数据结构·算法
事圆则缓5 小时前
Java 常见数据结构与 Android 使用场景
android·java·数据结构
白狐_7986 小时前
408 数据结构|外部排序优化:怎么减少时间开销
数据结构·算法
kiracrimson18 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
心抵鹊19 小时前
归并排序之翻转对(hard)
数据结构·算法