平时我们开发应用程序时会遇到使用栈的情况,通常情况下我们一般使用java sdk包里自带的栈,因为官方提供的肯定足够优秀。不过我们做为程序员,还是有必要去了解它的原理或实现,我们可以自己实现简单点的栈,并可以在简单的基础之上去设计出足够优秀与复杂的栈类型出来。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//设计一个简单基于数组的整型栈,考虑扩容与线程安全
public class StackX {
private int maxSize;
private int top; //代表当前当上面数据的索引
private int[] stackArray;
private Lock lock = new ReentrantLock();
public StackX(int size) throws Exception {
if (size == 0) {
throw new Exception("size must be bigger than 0");
}
this.maxSize = size;
top = -1; //代表没有数据
stackArray = new int[size];
}
public void push(int data) {
try {
lock.tryLock();
stackArray[++top] = data;
//判断一下是否满了,如果满了则扩容,每次扩一倍
if (top == maxSize - 1) {
int[] old = stackArray;
maxSize = maxSize * 2;
stackArray = new int[maxSize];
for (int i = 0; i <= top; i++) {
stackArray[i] = old[i];
}
}
} finally {
lock.unlock();
}
}
//弹出是顶上的元素,如果没有元素刚报错
public int pop() throws Exception {
try {
lock.tryLock();
if (top == -1) {
throw new Exception("the stack is empty");
} else {
return stackArray[top--];
}
} finally {
lock.unlock();
}
}
//查看最顶上的元素
public int peek() throws Exception {
try {
lock.tryLock();
if (top == -1) {
throw new Exception("the stack is empty");
} else {
return stackArray[top];
}
} finally {
lock.unlock();
}
}
public boolean isEmpty() {
try {
lock.tryLock();
return top == -1;
} finally {
lock.unlock();
}
}
//测试栈代码
public static void main(String[] args) {
try {
StackX stackX = new StackX(50);
for (int i = 0; i < 100; i++) {
stackX.push(i);
}
while (stackX.isEmpty() == false) {
System.out.print(stackX.pop() + " ");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}