1 /*
2 栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同
3 一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底
4 */
5 // class Stack {
6 // constructor() {
7 // this.items = []; // {1}
8 // }
9 // // 向栈添加元素:push--只添加元素到栈顶,也就是栈的末尾。push 方法可以如下这样写。
10 // push(element) {
11 // this.items.push(element);
12 // }
13 // //从栈移除元素:pop--移出的是最后添加进去的元素,同时返回被移除的元素
14 // pop() {
15 // return this.items.pop();
16 // }
17 // //查看栈顶元素:peep--该方法将返回栈顶的元素--如果想知道栈里最后添加的元素是什么
18 // peek() {
19 // return this.items[this.items.length - 1];
20 // }
21 // // 检查栈是否为空:isEmpty
22 // isEmpty() {
23 // return this.items.length === 0;
24 // }
25 // // 清空栈元素:clear
26 // clear() {
27 // this.items = [];
28 // }
29 // size() {
30 // return this.items.length;
31 // }
32 // }
33 // // 清空栈元素
34 // const stack = new Stack();
35 // console.log(stack.isEmpty()); // true
36 // // 添加元素
37 // stack.push(5);
38 // stack.push(2);
39 // console.log(stack.peek()); // 2
40
41
42 /*
43 创建一个基于 JavaScript 对象的 Stack 类
44 目的:如果数组有更多元素的话,所需的时间会更长。另外,数组是元
45 素的一个有序集合,为了保证元素排列有序,它会占用更多的内存空间。
46 如果我们能直接获取元素,占用较少的内存空间,并且仍然保证所有元素按照我们的需要排
47 列,那不是更好吗?
48 */
49
50 class Stack {
51 constructor() {
52 this.count = 0; // 记录栈的大小
53 this.items = {};
54 }
55 push(element) {
56 this.items[this.count] = element;
57 this.count++;
58 }
59 size() {
60 return this.count;
61 }
62 isEmpty() {
63 return this.count === 0;
64 }
65 pop() {
66 if (this.isEmpty()) {
67 return undefined;
68 }
69 this.count--;
70 const result = this.items[this.count];
71 delete this.items[this.count];
72 return result;
73 }
74 peek() {
75 if (this.isEmpty()) {
76 return undefined;
77 }
78 return this.items[this.count - 1];
79 }
80 clear() {
81 this.items = {};
82 this.count = 0;
83 }
84 toString() {
85 if(this.isEmpty()) {
86 return '';
87 }
88 let objString = `${this.items[0]}`;
89 for(let i = 1; i < this.count; i++) {
90 objString = `${objString},${this.items[i]}`
91 }
92 return objString;
93 }
94 }