栈的基本概念:
栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。
由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈也称为后进先出表。
栈的简单执行顺序
![96a684bcbf29ba9effc12eb04d203ddc.png](https://i-blog.csdnimg.cn/blog_migrate/abebfe32191ade02507451da446e7626.jpeg)
代码实现:
public class Stack implements Serializable {
//初始化栈 的容量
private int maxSize = 16;
//栈顶
private int top = -1;
//底层是一个数组
private Object[] dataStore;
public Stack() {
dataStore = new Object[maxSize];
}
public Stack(int maxSize) {
this.maxSize = maxSize;
dataStore = new Object[maxSize];
}
//取得容器大小的方法
public int getMaxSize() {
return maxSize;
}
//取得栈的可用数
public int useSize() {
return maxSize-top-1;
}
//取得已经使用
public int usedSize() {
return top + 1;
}
///压入栈的过程
public void push(T obj) throws MyException{
MyException myException = new MyException();
if((top + 1)>= maxSize ) {
throw myException;
}else {
dataStore[++top] = obj;
}
}
//出栈的过程
public T pop() {
if(top == -1) {
return null;
}else {
return (T) dataStore[top--];
}
}
}
自定义异常:
public class MyException extends Exception {
@Override
public String getMessage() {
// TODO Auto-generated method stub
return "栈已满了";
}
}
测试:
public class StaTest {
@Test
public void test01() {
Stack st = new Stack(8);
//压栈
try {
st.push("AAAAA");
st.push("BBBBBB");
st.push("CCCCCC");
st.push("DDDD");
System.out.println(st.pop());
st.push("EEEEE");
st.push("FFFFF");
//st.push("GGGGGG");
//st.push("EEEEE");
//st.push("FFFFF");
//st.push("GGGGGG");
System.out.println(st.usedSize());
for (int i = 0; i < 6; i++) {
System.out.println(st.pop());
}
} catch (MyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
测试结果:
![e13de8cfe8e1c06d9ebb04862747e0b0.png](https://i-blog.csdnimg.cn/blog_migrate/5b77965e6648cc27dd876c2f2d24dc85.jpeg)