什么是栈
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。(摘自百度百科)
栈:
先进后出,只在栈顶进行操作
栈的基本操作
- push():将数据压入栈中
- pop():将栈顶元素弹出
- peek():不弹出获取栈顶元素
- isEmpty():判断栈是否为空
- isFull():判断栈是否已满
- display():栈的遍历
创建栈 ArrayStack
栈是一种特殊的线性表,只能在栈顶即表的一头进行操作。线性表讲究次序,所以我们可以使用数组来存放数据,因此用数组实现的栈也可以叫做数组栈。数组类型为Object,用于更方便地存储不同类型的数据。
- 创建类ArrayStack存放栈的成员变量和各种基本操作方法。
- 创建一个top指针来指向栈顶,栈顶指针初始值为-1,表示目前栈内没有任何元素。
- 需要一个变量maxSize描述栈的最大容量,创建ArrayStack的构造方法来初始化数组即栈的最大容量。
//创建栈
private int top = -1; //栈顶指针,初始值为-1
private Object stack[]; //存放数据的数组
private int maxSize; //栈的最大空间
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new Object[this.maxSize];//初始化最大容量
}
判断栈满 isFull()
判断栈满,即是判断栈顶指针top是否等于栈的最大容量。
//栈满
public boolean isFull() {
return top == maxSize - 1;
}
判断栈空 isEmpty()
判断栈空,只需要返回栈顶指针top是否等于-1,等于-1证明栈内无任何元素。
//栈空
public boolean isEmpty() {
return top == -1;
}
压栈 push()
压栈是栈的最重要的操作之一。压栈前需要判断栈是否为满,并通过栈顶指针top执行压栈操作。
- 判断栈是否已满,如果栈满则不执行。
- 先将栈顶指针top自增1,即栈顶指针往上移了一位,指向了第一个栈内元素。
- 将压入栈中的数据存入数组。
//压栈
public void push(Object value) {
//如果栈满则无法压栈
if(isFull()) {
System.out.println("栈满");
return ;
}
//栈顶指针往上移一位
top++;
stack[top] = value;
}
弹栈 pop()
弹栈是栈的最重要的操作之一。弹栈前需要判断栈是否为空,并通过栈顶指针top执行弹栈操作。因为弹栈有返回值,所以返回前需要一个变量来接取将要弹出的值。
- 判断栈是否为空,如果栈空则返回-1。
- 获取栈顶指针top指向的数据并使用变量接取。
- 栈顶指针top自减1,即栈顶指针下移一位。
- 返回接取栈顶元素值的变量
//弹栈
public Object pop() {
//如果栈空则无法弹栈
if(isEmpty()) {
System.out.println("栈空");
return -1;
}
Object value = stack[top];
//栈顶指针往下移一位
top--;
return value;
}
获取栈顶元素 peek()
获取栈顶元素需要先判断栈是否为空,如果不为空则返回。
//获取但是不弹出栈顶元素
public Object peek() {
return isEmpty() ? null : stack[top];
}
栈的遍历 display()
因为栈只能通过栈顶对元素进行操作,如果栈内有值,栈顶指针top会一直指向栈顶的元素,所以栈的遍历是从栈顶开始。
//遍历栈
public void display() {
for(int i = top;i >= 0;i--)
System.out.println(stack[i]);
}
完整代码
//数组栈
class ArrayStack {
private int top = -1; //栈顶指针,初始值为-1
private Object stack[]; //存放数据的数组
private int maxSize; //栈的最大空间
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new Object[this.maxSize];
}
//栈满
public boolean isFull() {
return top == maxSize - 1;
}
//栈空
public boolean isEmpty() {
return top == -1;
}
//压栈
public void push(Object value) {
//如果栈满则无法压栈
if(isFull()) {
System.out.println("栈满");
return ;
}
//栈顶指针往上移一位
top++;
stack[top] = value;
}
//弹栈
public Object pop() {
//如果栈空则无法弹栈
if(isEmpty()) {
System.out.println("栈空");
return -1;
}
Object value = stack[top];
//栈顶指针往下移一位
top--;
return value;
}
//获取但是不弹出栈顶元素
public Object peek() {
return isEmpty() ? null : stack[top];
}
//遍历栈
public void display() {
for(int i = top;i >= 0;i--)
System.out.println(stack[i]);
}
}