栈(stack)
栈是限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶。
//栈(Stack):是限定仅在表尾进行插入和删除操作的线性表
//栈有两中操作,入栈和出栈
//栈的抽象数据类型
interface Stack {
//初始化/
//init();
/**销毁 */
destroy();
/**清空 */
clear();
/**判空 */
empty(): boolean;
/**返回栈顶元素 */
getTop();
/**入栈 */
push(obj);
/**出栈 */
pop();
/**栈长 */
length;
}
//栈的数组实现
class Stack1 implements Stack {
private _arr: any[];
private _length: number;
public constructor() {
this._arr = [];
this._length = 0;
}
/**销毁 */
destroy() {
this._arr = null;
this._length = null;
}
/**清空 */
clear() {
while (this._length > 0) {
this.pop();
}
this._arr = [];
}
/**栈长 */
get length() {
return this._length;
}
/**判空 */
empty(): boolean {
return this.length == 0;
}
/**返回栈顶元素 */
getTop() {
return this._length ? this._arr[this._length - 1] : this._arr[0];
}
/**入栈 */
push(obj) {
this._arr[this._length] = obj;
this._length++;
}
/**出栈 */
pop() {
if (this.empty())
return;
let element = this._arr[this._length - 1];
element = null;
this._arr.length--;
this._length--;
return element;
}
}
//栈的链式结构实现
//Stack的链式实现
class StackNode {
data: any;
next: StackNode;
}
class LinkStack implements Stack {
private _length: number;
private head: StackNode;
constructor() {
this.head = new StackNode();
this._length = 0;
}
/**入栈 */
push(obj) {
//obj的next节点接上 head节点的next
//head节点的next赋值给obj
let next = new StackNode();
next.data = obj;
if (this.empty()) {
this.head.next = next;
next.next = null;
} else {
next.next = this.head.next;
this.head.next = next;
}
this._length++;
}
/**出栈 */
pop() {
if (this.empty())
return;
//断开head的next节点,并把head的next节点接上head.next的next
let next = this.head.next;
this.head.next = next.next;
next.next = null;
this._length--;
return next;
}
getTop() {
return this.head.next;
}
/**判空 */
empty(): boolean {
return this.length == 0;
}
/**栈长 */
get length() {
return this._length;
}
/**销毁 */
destroy() {
this.clear();
this.head = null;
this._length = null;
}
/**清空 */
clear() {
while (this.head.next) {
let next = this.pop();
next = null;
}
}
}