Skip to content

数据结构与算法

栈结构

特性:首限的线性结构 / 先进后出

接口

ts
interface IStack<T> {
  push(value: T): void;
  pop(): T | undefined;
  peek(): T | undefined;
  size: number;
  isEmpty(): boolean;
}

export default IStack;

实现

数组

ts
import IStack from "./IStack";

class ArrayStack<T = any> implements IStack<T> {
  private data: T[] = [];

  push(value: T) {
    this.data.push(value);
  }

  pop() {
    return this.data.pop();
  }

  peek() {
    return this.data[this.data.length - 1];
  }

  get size() {
    return this.data.length;
  }

  isEmpty() {
    return this.data.length === 0;
  }
}

const stack = new ArrayStack<string>();

stack.push("aaa");
stack.push("bbb");
stack.push("ccc");

console.log(stack.peek());
console.log(stack.pop());
console.log(stack.pop());
console.log(stack.pop());

console.log(stack.size);
console.log(stack.isEmpty());

链表

ts
import IStack from "./IStack";

class ListNode<T> {
  public next: ListNode<T> | null;

  constructor(public value: T) {
    this.next = null;
  }
}

class LinkedListStack<T> implements IStack<T> {
  // head -> 栈顶
  private head: ListNode<T> | null = null;
  private stackSize: number = 0;

  push(value: T): void {
    const node = new ListNode(value);
    node.next = this.head;
    this.head = node;

    this.stackSize++;
  }

  pop(): T | undefined {
    if (!this.head) return;

    const value = this.head.value;
    this.head = this.head.next;
    this.stackSize--;

    return value;
  }

  peek(): T | undefined {
    return this.head?.value;
  }

  isEmpty(): boolean {
    return this.size === 0;
  }

  get size() {
    return this.stackSize;
  }
}

const stack = new LinkedListStack<number>();
stack.push(1);
stack.push(2);
stack.push(3);

console.log(stack.peek());
console.log(stack.pop());
console.log(stack.pop());
console.log(stack.pop());
console.log(stack.size);
console.log(stack.isEmpty());

算法题

有效的括号

ts
// 20. 有效的括号

function isValid(s: string): boolean {
  if (s.length % 2 !== 0) return false;

  const stack: string[] = [];
  const bracketMap: Record<string, string> = {
    "(": ")",
    "[": "]",
    "{": "}",
  };
  const leftBracket = Object.keys(bracketMap);

  for (let char of s) {
    if (leftBracket.includes(char)) {
      stack.push(bracketMap[char]);
    } else {
      if (stack.pop() !== char) return false;
    }
  }

  return !stack.length;
}

console.log(isValid("()[]{}"));
console.log(isValid("(]"));
console.log(isValid("([])"));

二进制转换

ts
function binary(n: number): string {
  const stack = [];

  let value = n;

  while (value > 0) {
    const remainder = value % 2;
    stack.push(remainder);
    value = Math.floor(value / 2);
  }

  let str = "";

  while (stack.length) {
    str += stack.pop();
  }

  return str;
}

console.log(binary(100));

/*
  不断的 / 2 取余数
  10 / 2 = 0
  5 / 2 = 1
  2 / 2 = 0
  1 / 0 = 1
  0

  [1,0,1,0]
*/

转载请注明出处,违者必究