栈
什么是栈
1.栈的英文是stack
2.栈是一个先入后出的有序列表
3.栈是限制线性表元素的插入和删除只能在线性表的同一端进行的一种特殊的线性表,允许插入和删除的一端是,为变化的一端,成为栈顶,另外的一端为固定的一端为栈底
4.栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除的情况刚好相反,最后放入的元素先删除,最先放入的元素后删除
栈的应用场景
1.子程序的调用,在跳向子程序之前会先将下一条指令的地址存放在堆栈中,直到子程序执行后再将地址取出,最后回到原来的程序之中
2.递归的调用,和子程序的调用类似,只是出了存储下一个指令的地址外,也将参数、区域变量、等数据压入栈中
3.表达式的转换与求值
4.二叉树的遍历
5.图形的深度优先搜索
代码
栈
package stack;
public class ArrayStack {
private int maxSize;//最大值
private int[] stack;//栈
private int top=-1;//栈顶
//构造器
public ArrayStack(int maxSize) {
this.maxSize=maxSize;
stack=new int[this.maxSize];
}
//栈满
public boolean isFull() {
return top==maxSize-1;
}
//栈空
public boolean isEmpty() {
return top==-1;
}
//入栈-push
public void push(int value) {
//先判断是否栈满了
if(isFull()) {
System.out.println("栈已经满了~");
return;
}else {
top++;
stack[top]=value;
}
}
//出栈-pop
public int pop() {
if(isEmpty()) {
throw new RuntimeException("栈已经空了~");
}
int value=stack[top];
top--;
return value;
}
//遍历栈
public void list() {
if(isEmpty()) {
System.out.println("栈空,没有数据~");
}
for(int i=top;i>=0;i--) {
System.out.printf("stack[%d]=%d
",i,stack[i]);
}
}
}
测试类
package stack;
import java.util.Scanner;
public class TestArrayList {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayStack stack=new ArrayStack(4);
String key="";
boolean loop=true;
Scanner scanner=new Scanner(System.in);
while(loop) {
System.out.println("show:显示栈");
System.out.println("exit:退出测试");
System.out.println("push:压栈");
System.out.println("pop:出栈");
System.out.println("请输入你的选择:");
key=scanner.next();
switch (key) {
case "show":
stack.list();
break;
case "push":
System.out.println("请输入一个数:");
int value=scanner.nextInt();
stack.push(value);
break;
case "pop":
try {
int res=stack.pop();
System.out.printf("出栈的元素为:%d
",res);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop=false;
break;
default:
break;
}
}
System.out.println("程序退出!");
}
}