什么是栈

栈,只有一个出口,是一种后进先出的线性数据结构,也就是传说中的 LIFO(last in first out)

栈,只有一个出口,从哪里进,就从哪里出,这个出口也叫 栈顶 ,对应的底部就叫 栈底

如图示:

1571058305-f14712f04c01742.gif

栈的实现

由于数组的特性,用数组来实现栈是最简单的了。大致的功能如下:

  • push: 用来将元素推入栈顶
  • pop: 删除栈顶的元素,并返回
  • peek: 返回栈顶元素
  • isEmpty: 判断栈是否是空栈
  • size: 返回栈的长度
  • clear: 清空栈

代码实现:

  1. class Stack {
  2. constructor() {
  3. this.items = [];
  4. }
  5. push(element) {
  6. return this.items.push(element);
  7. }
  8. pop() {
  9. return this.items.pop();
  10. }
  11. peek() {
  12. return this.items[this.items.length - 1];
  13. }
  14. isEmpty() {
  15. return this.items.length === 0;
  16. }
  17. size() {
  18. return this.items.length;
  19. }
  20. clear() {
  21. this.items = [];
  22. }
  23. toString() {
  24. return this.items.toString();
  25. }
  26. }

栈的应用

1. 进制转换

10 进制转换为任意进制。

转换原理:
image.png
如上用十进制转换为二进制示意,不断的对余数取整, push 进栈,最后从栈顶一一取出即可。

  1. function baseConverter(number, base) {
  2. const stack = new Stack();
  3. const digits = '0123456789abcdefghijklmnopqrstuvwxyz';
  4. let decNumber = number;
  5. let result = '';
  6. if (base < 2 || base > 32) {
  7. return '';
  8. }
  9. while (decNumber > 0) {
  10. stack.push(Math.floor(decNumber % base));
  11. decNumber = Math.floor(decNumber / base);
  12. }
  13. while (!stack.isEmpty()) {
  14. result += digits[stack.pop()];
  15. }
  16. return result;
  17. }

2. 撤销回退功能

  1. const go = new Stack();
  2. const back = new Stack();
  3. go.push(1);
  4. go.push(2);
  5. go.push(3);
  6. let ctrlZ = function () {
  7. back.push(go.pop());
  8. }
  9. let unCtrlZ = function () {
  10. go.push(back.pop());
  11. }
  12. console.log('go', go.toString(), 'back', back.toString())
  13. ctrlZ();
  14. console.log('go', go.toString(), 'back', back.toString())
  15. ctrlZ();
  16. console.log('go', go.toString(), 'back', back.toString())
  17. unCtrlZ();
  18. console.log('go', go.toString(), 'back', back.toString())