【学习】【js】栈数据结构
栈
栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
基于数组的栈
时间复杂度O(n),占用较多的内存空间。
export interface Stack<T = any> {push(...elements: T[]): void; // 添加一个(或几个)新元素到栈顶;pop(): T | undefined; // 移除栈顶元素,同时返回被移除的元素;peek(): T | undefined; // 返回栈顶的元素,不对栈做任何修改;isEmpty(): boolean; // 如果栈里没有任何元素就返回true,否则返回false;clear(): void; // 移除栈里所有元素;size(): number; // 返回栈里的元素个数。
}export class Stack<T = any> implements Stack<T> {#items: T[] = [];push(...elements: T[]): void {this.#items.push(...elements);}pop(): T | undefined {return this.#items.pop();}peek(): T | undefined {return this.#items[this.#items.length - 1];}isEmpty(): boolean {return this.#items.length === 0;}clear(): void {this.#items = [];}size(): number {return this.#items.length;}
}
import { describe, test, expect } from "@jest/globals";
import { Stack } from "./index";
describe("index module", () => {test("stack", () => {const stack = new Stack<number>();stack.push(1, 2, 3);expect(stack.pop()).toBe(3);expect(stack.peek()).toBe(2);expect(stack.isEmpty()).toBe(false);expect(stack.size()).toBe(2);stack.clear();expect(stack.isEmpty()).toBe(true);expect(stack.size()).toBe(0);});
});
基于对象的栈
时间复杂度O(1),占用较少的内存空间。
export interface Stack<T = any> {push(...elements: T[]): void; // 添加一个(或几个)新元素到栈顶;pop(): T | undefined; // 移除栈顶元素,同时返回被移除的元素;peek(): T | undefined; // 返回栈顶的元素,不对栈做任何修改;isEmpty(): boolean; // 如果栈里没有任何元素就返回true,否则返回false;clear(): void; // 移除栈里所有元素;size(): number; // 返回栈里的元素个数。
}export class Stack<T = any> implements Stack<T> {#count: number = 0;#items: { [key: number]: T } = {};push(...elements: T[]): void {for (let index = 0; index < elements.length; index++, this.#count++) {const element = elements[index];this.#items[this.#count] = element;}}pop(): T | undefined {if (this.isEmpty()) {return undefined;}this.#count--;const result = this.#items[this.#count];delete this.#items[this.#count];return result;}peek(): T | undefined {if (this.isEmpty()) {return undefined;}return this.#items[this.#count - 1];}isEmpty(): boolean {return this.#count === 0;}clear(): void {this.#items = {};this.#count = 0;}size(): number {return this.#count;}
}
import { describe, test, expect } from "@jest/globals";
import { Stack } from "./stack-array";
describe("index module", () => {test("stack", () => {const stack = new Stack<number>();stack.push(1, 2, 3);expect(stack.pop()).toBe(3);expect(stack.peek()).toBe(2);expect(stack.isEmpty()).toBe(false);expect(stack.size()).toBe(2);stack.clear();expect(stack.isEmpty()).toBe(true);expect(stack.size()).toBe(0);});
});