栈的介绍
栈的英文为(stack)
2) 栈是一个先入后出(FILO-First In Last Out)的有序列表。
3) 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的
一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
4) 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元
素最先删除,最先放入的元素最后删除
5) 图解方式说明出栈(pop)和入栈(push)的概念
栈的应用场景
1) 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以
回到原来的程序中。
2) 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆
栈中。
3) 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
4) 二叉树的遍历。
5) 图形的深度优先(depth 一 first)搜索法
栈的快速入门
1) 用数组模拟栈的使用,由于栈是一种有序列表,当然可以使用数组的结构来储存栈的数据内容,
下面我们就用数组模拟栈的出栈,入栈等操作。
2) 实现思路分析,并画出示意图
代码
package com.example.demo1.dataStructure;
/**
* @author liangqing
* @since 2021/2/4 16:08
* <p>
* 基于数组实现栈
* 要素
* 1.定义栈顶指针 top 默认 -1
* 先进后出
*/
public class ArrayStack {
public static void main(String[] args) {
AStack<Integer> aStack = new AStack<>(5);
for (int i = 0; i < 6; i++) {
aStack.pushStack(i);
}
for (int i = 0; i < 7; i++) {
System.out.println(aStack.popStack());
}
}
static class AStack<V> {
private int pop = -1;
private final V[] table;
private final int maxSize;
public AStack(int maxSize) {
this.maxSize = maxSize;
table = (V[]) new Object[maxSize];
}
//栈空间是否满了
private Boolean isFull() {
return pop == maxSize - 1;
}
//栈空间是否为空
private Boolean isEmpty() {
return pop == -1;
}
//入栈
private void pushStack(V v) {
if (isFull()) {
System.out.println("当前栈已经满了");
return;
}
pop++;
table[pop] = v;
}
//出栈
private V popStack() {
if (isEmpty()) {
System.out.println("当前栈为空");
return null;
}
V v = table[pop];
pop--;
return v;
}
//读取,不弹出
private V pickStack() {
return table[pop];
}
}
}