一、基于数组实现栈(Java)
public class ArrayStack<T> {
private T[] a;
private int N;
public ArrayStack() {
a =(T[]) new Object[10];
}
// 返回栈里的元素个数
public int size() {
return N;
}
// 栈里是否还有元素,如果没有则返回true
public boolean isEmpty() {
return N == 0;
}
// 添加一个元素到栈顶
public void push(T e) {
if(N == a.length) {
resize(2 * N);
}
a[N++] = e;
}
// 移除栈顶的元素
public T pop() {
T e = a[--N];
a[N] = null; // 避免对象游离
if(N == a.length / 4 && N > 0) {
resize(a.length / 2);
}
return e;
}
// 返回栈顶的元素
public T peek() {
return a[N];
}
// 数组缩容与扩容
private void resize(int newCap) {
T[] newArr = (T[]) new Object[newCap];
for(int i = 0; i < a.length; i++) {
newArr[i] = a[i];
}
a = newArr;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("Stack: [");
for(int i = 0; i < N; i++) {
sb.append(a[i]);
sb.append(", ");
}
sb.delete(sb.length() - 2, sb.length());
sb.append("] top");
return sb.toString();
}
}
二、基于链表实现栈(Java)
未完待续。。。
三、基于数组实现栈(JavaScript)
// 基于数组实现的栈
function ArrayStack(){
let a = [];
// 动态原型模式
if(typeof this.size !== "function"){
// 返回栈里的元素个数
ArrayStack.prototype.size = function(){
return a.length;
};
// 栈里是否还有元素,如果没有则返回true
ArrayStack.prototype.isEmpty = function(){
return a.length == 0;
};
// 添加一个元素到栈顶
ArrayStack.prototype.push = function(e){
a.push(e);
};
// 移除栈顶的元素
ArrayStack.prototype.pop = function(){
return a.pop();
};
// 查看栈顶的元素
ArrayStack.prototype.peek = function(){
return a[a.length - 1];
};
// 重写toString()方法
ArrayStack.prototype.toString = function(){
let str = "stack [";
a.forEach((item, index, array) => {
str += item + ", ";
});
str = str.slice(0, str.length - 2);
str += "] top";
return str;
};
}
};