问题引出:
1.栈的英文是stack
2.栈是一个先入后出的有序列表
3.栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。
允许插入和删除的一端,会变化的一端,称之为站栈顶(Top)
另外一端为固定的一端,称之为栈底(Bottom)
4.根据栈的定义可知,最先放入栈的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放的元素最后删除。
栈的应用场景
1.子程序的调用:在跳往子程序前,会将下一个指令的地址存到堆栈中,直到此程序执行完后再将地址取出,以回到原来的程序中。
(类似jvm虚拟机栈中的程序记数器)
2.处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地之外,也将参数、区域变量等数据存入到堆栈中。
3.表达式的转换【中缀表达式转后缀表达式】与求值(实际解决)
4.二叉树的遍历
5.图形的深度优先(depth-first)搜索法
代码实现:
class ArrayStack {
//数组模拟栈
private int[] stack;
//栈顶,初始为-1
private int top = -1;
//栈的最大容量
private int maxSize;
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
this.stack = new int[maxSize];
}
/**
* 判断栈满
*
* @return
*/
public boolean isFull() {
return top == maxSize - 1;
}
/**
* 判断栈空
*
* @return
*/
public boolean isEmpty() {
return top == -1;
}
/**
* 入栈
*
* @param value 入栈的值
*/
public void push(int value) {
if (isFull()) {
System.out.println("栈已经满了");
return;
}
//栈顶上移一位,并赋值
stack[++top] = value;
}
/**
* 出栈
*
* @return 出栈的值
*/
public int pop() {
if (isEmpty()) {
throw new RuntimeException("栈已经空了!");
}
//取出栈顶的值,并将栈顶下移一位
return stack[top--];
}
/**
* 遍历栈
*/
public void listStack() {
for (int i = top; i >= 0; i--) {
System.out.println("出栈顺序:" + stack[i]);
}
}
}
测试:
public class ArrayStackDemo {
public static void main(String[] args) {
ArrayStack stack=new ArrayStack(4);
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.listStack();
System.out.println("准备出栈-------");
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
}
}
输出:符合预期
出栈顺序:4
出栈顺序:3
出栈顺序:2
出栈顺序:1
准备出栈-------
4
3
2
1
Exception in thread "main" java.lang.RuntimeException: 栈已经空了!