1.栈是限定仅在表尾进行插入和删除的线性表
允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈,栈又称为后进先出的线性表,简称LIFO结构。
1.1 栈的插入操作,叫做进栈,也称压栈,入栈。子弹如弹夹
栈的删除操作,叫做出栈。子弹弹出弹夹
1.2 先进栈的元素是不是只能最后出栈?
答案不一定,如果有3个元素,有5种可能的出栈顺序。
1.3 栈的顺序存储结构和实现
1.3.1 用数组实现栈,下标为0的一端作为栈底较好,大头做栈顶,因为经常要做插入和取出的操作。
1.3.2 我们用一个top的变量指示栈顶元素在数组中得位置,当栈只有一个元素时,top等于0,空栈的top=-1。
1.3.3 栈的结构定义
见后面实现代码
1.3.4 若有一个栈,StackSize是5,请看下图
1.3.5 栈的顺序存储结构——各种操作实现
public class StackDemo {
public static void main(String[] args) {
Stack stack = new Stack(5);
stack.initStack();
}
}
class Stack {
private int[] data = null;
private int capacity; // 栈的容量
private int top; // 栈顶指针
public Stack(int capacity) {
this.capacity = capacity;
}
/*
* 初始化栈
*/
public void initStack() {
data = new int[capacity];
top = -1;
}
/*
* 入栈
*/
public String push(int element) {
if (top == capacity - 1) {
return "ERROR, 栈满";
}
// 先top加1,然后再插入值
top++;
data[top] = element;
return "SUCCESS";
}
/*
* 出栈
*/
public int pop() {
if (top == -1) {
return -1; // 空栈返回-1
}
// 先top减1,然后再返回值
int temp = top;
top--;
return data[temp];
}
/*
* 栈元素个数
*/
public int stackLength() {
if (top == -1) {
return 0;
}
return top + 1;
}
/*
* 判断栈是否为空
*/
public boolean isEmpty() {
if (top == -1) {
return true;
}
return false;
}
// 栈置为空
public void clear() {
this.top = -1;
}
/*
* 从栈底开始打印所有元素
*/
public void print() {
for (int i : data) {
System.out.print(i + " ");
}
}
}