第五章 栈
栈的介绍
- 栈的英文为stack
- 栈是一个先入后出的有序列表
- 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的特殊线性表,允许插入和删除的一端为变化的一端,称为栈顶,,另一端为固定的一端,称为栈底
- 最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
图解
栈的应用场景
1.子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
2.处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
3.表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
4.二叉树的遍历。
5.5)图形的深度优先(depth一 first)搜索法。
用数组模拟栈的使用
(栈是一种有序列表,可以用数组的结构来存储数据)
实现思路
- 使用数组来模拟
- 定义一个top表示栈,初始化为-1
- 入栈的操作,当有数据加入时,top++;stack[top] = date;
- 出栈的操作,invalue = stack[top];top–;return value;
代码实现
public class ArrayStack {
//栈顶
int top;
//栈的大小
int max_Stack;
//存储数据的数组
int[] array;
//构造器
public ArrayStack(int max_Stack){
top = -1;
this.max_Stack = max_Stack;
array = new int[max_Stack];
}
//判断栈是否满
boolean isFull(){
return top == max_Stack-1;
}
//判断是否为空
boolean isEmpty(){
return top == -1;
}
//入栈操作
void push(int date){
//先判断是否满
if(isFull()){
System.out.println("栈满");
return;
}
top++;
array[top] = date;
}
//出栈操作
int pop(){
if(isEmpty()){
System.out.println("栈空");
return 000000000;
}else {
int value = array[top];
top--;
return value;
}
}
//显示数据
void show(){
if(isEmpty()){
System.out.println("栈空");
return;
}
//只是显示,不能改变top的值
for(int i=top;i>=0;i--){
System.out.println(array[i]);
}
}
}
测试类
import java.util.Scanner;
public class ArrayStackDemo {
public static void main(String[] args) {
//定义标签控制循环结束
boolean flag = true;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入栈的最大值");
ArrayStack target = new ArrayStack(scanner.nextInt());
while(flag){
System.out.println("1添加数据入栈 2出栈 3显示栈内数据 4退出");
switch(scanner.nextInt()){
case 1:
System.out.println("请输入你要添加发的数据");
target.push(scanner.nextInt());
break;
case 2:
target.pop();
break;
case 3:
target.show();
break;
case 4:
scanner.close();
flag = false;
break;
default:
System.out.println("输入有误");
}
}
}
}