数据结构-栈/队列

在上一篇文章中我们用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();
  }
相关推荐
m0_5474866614 分钟前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
旖旎夜光24 分钟前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
我变成萤火虫2 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
白狐_7983 小时前
408数据结构第7章:B树①——基础概念与结构
数据结构·b树
Suxing93 小时前
C语言基础分享:从“租房”到“拆迁”,C语言动态内存管理
java·数据结构·算法
LuminousCPP4 小时前
单链表专题(四)-刷题复盘篇-LeetCode 138 随机链表复制|原地拷贝法突破复杂指针操作
数据结构·笔记·算法·leetcode·链表
逆境不可逃4 小时前
【LeetCode 912】排序数组——随机化快速排序详解
数据结构·算法·排序算法
c238564 小时前
《算法武林谱:四大排序神功与二分寻宝术全解》
数据结构·算法·排序算法
OpenApi.cc5 小时前
MoCode — AI Agent Server (Docker) + macOS Desktop Client(开源项目)
数据结构·人工智能·深度学习·神经网络
Mem0rin5 小时前
二分查找:左右边界
数据结构·算法