自己动手写一个简单的栈结构
栈,是从刚开始接触数据结构时,除了数组之外,第二个学习的结构,所以如果你问栈的特点是什么,很多人可能脱口而出:“先进后出”,没错,“先进后出”就是“栈”这种结构的特点。
那么如果要我们自己去写一个栈,该如何写呢?
首先,栈的底层是一个数组结构,知道了这一点,其他的工作都好说。
知道了栈的底层是一个数组结构,那么我们就可以将一个数组包装成为一个栈结构,栈的常用方法无非就是压栈,弹栈,查询栈顶元素,相对来讲还是比较简单的。具体请看代码:
package myStack;
public class MyStack {
// 栈的底层是一个数组,所以这里定义一个long类型的数组
private long[] arr;
// 定义一个栈顶
private int top;
/**
* 空参构造
*/
public MyStack() {
// 默认栈里面可以压入30个元素
arr = new long[30];
// 默认栈顶为-1,即空栈
top = -1;
}
/**
* 有参构造
* @param MaxSize
*/
public MyStack(int MaxSize) {
// 通过用户传入的参数定义栈的大小
arr = new long[MaxSize];
// 默认栈顶为-1,即空栈
top = -1;
}
/**
* 压栈方法,将数据压入栈中
* @param value
*/
public void push(long value) {
if(isFull()) {
System.out.println("发生了栈溢出错误!");
System.exit(0);
}else {
arr[++top] = value;
}
}
/**
* 弹栈方法,将数据从栈中弹出
* @return
*/
public long pop() {
return arr[top--];
}
/**
* 查询方法,查询栈顶元素
* @return
*/
public long peek() {
return arr[top];
}
/**
* 判断栈是否是空栈
* @return
*/
public boolean isEmpty() {
return top == -1;
}
/**
* 判断栈是否满了
* @return
*/
public boolean isFull() {
return top == arr.length - 1;
}
}
测试代码:
package myStack;
public class TestMyStack {
public static void main(String[] args) {
MyStack myStack = new MyStack(5);
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
myStack.push(5);
for(int i = 0; i < 5; i++) {
System.out.println(myStack.pop());
}
System.out.println(myStack.isEmpty());
myStack.push(5);
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
myStack.push(5);
}
}
控制台输出结果:
5
4
3
2
1
true
发生了栈溢出错误!