带你走进Java数据结构与算法(六)

124 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第十七天,点击查看活动详情

🤗前言:上文学习了链表,本文带领大家更加深入学习栈 stack~

栈 stack

  • 先入后出的有序列表
  • 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一 种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另 一端为固定的一端,称为栈底(Bottom)
  • 最先放入栈中元素在栈底,最后放入的元素在栈顶,而 删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除

出栈(pop) 、入栈(push)结构

image-20220811211410996

应用场景

  1. 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到 子程序执行完后再将地址取出,以回到原来的程序中
  2. 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外, 也将参数、区域变量等数据存入堆栈中
  3. 表达式的转换 [ 中缀表达式转后缀表达式 ] 与求值(实际解决)
  4. 二叉树的遍历
  5. 图形的深度优先( depth一first )搜索法

栈的快速入门

  1. 用数组模拟栈
  2. 栈顶:定义变量初始值 top = -1
  3. 入栈:top++,stack[top] = data
  4. 出栈:int value = stack[top] ,top -- ,return value
package com.stack;
​
import java.util.Scanner;
​
/**
 * 栈
 * @author Kcs 2022/8/11
 */
public class ArrayStackDemo {
    public static void main(String[] args) {
        //测试
        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("push:添加数据到栈(入栈)");
            System.out.println("pop:从栈中取出数据(出栈)");
            System.out.println("exit:退出栈");
            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\n", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case "exit":
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
​
            }
        }
        System.out.println("程序退出,欢迎下次再来!!!");
    }
}
​
​
/**
 * 定义一个ArrayStack 表示栈
 */
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;
    }
​
    /**
     * 入栈
     */
    public void push(int value) {
        //判断是否栈满
        if (isFull()) {
            System.out.println("栈满");
            return;
        }
        top++;
        stack[top] = value;
    }
​
    /**
     * 出栈
     */
    public int pop() {
        //判断是否栈满
        if (isEmpty()) {
            throw new RuntimeException("栈空,没有存储数据");
        }
        int value = stack[top];
        top--;
        return value;
    }
​
    /**
     * 遍历栈,遍历时从栈顶开始
     */
    public void list() {
        if (isEmpty()) {
            System.out.println("栈空,没有存储数据");
            return;
        }
        //从栈顶显示数据
        for (int i = top; i >= 0; i--) {
            System.out.printf("stack[%d] = %d\n", i, stack[i]);
        }
    }
​
}