概述

  • 栈就是一种 只允许在表尾进行插入和删除操作 的 线性表
  • 栈的特点
    • 先进后出 ,在表尾进行插入和删除操作



数组实现栈

  • crown
    • crown:使用crown来确定栈顶所在数组的下标,默认为 -1
  • 空栈
    • 当空栈时 ,crown = -1
  • 栈是否为空
    • 当 crown = -1 时 ,栈为空 ,不能 遍历 ,出栈 , 获取栈顶元素
  • 栈是否已满
    • 当 crown = 数组.length – 1 时 ,栈已满 , 不能 入栈
  • 入栈
    • 栈未满,才能入栈
      • 先将 crown上移 ,再给数组下标为crown的元素赋值
    • 栈满 ,不能入栈
  • 出栈
    • 栈不为空 ,才能出栈
      • 将 crown往下移即可
    • 栈为空 ,不能出栈
  • 获取栈顶元素
    • 栈不为空 ,才能获取栈顶元素
      • 获得数组下标为crown的元素
    • 栈为空 ,不能出栈
  • 重置栈
    • 让crown = -1 即可
  • 打印栈
    • 遍历数组下标范围为 [ 0 , crown ] ,即可
public class ArrayStack {    private int[] satck;    private int size;    private int crown = -1; // 栈顶    public ArrayStack(int size){        this.size = size;        satck = new int[size];    }    //入栈操作    public void push(int value){        if (!isFull()){            satck[++crown] = value;        }    }    //出栈    public void pop(){        if (!isEmpty()){            crown--;        }    }    //判断是否为空    public boolean isEmpty(){        return crown == -1;    }    //判断栈是否已满    public boolean isFull(){       return crown == size-1;    }    //获取栈顶元素    public int getTop(){        if (!isEmpty()){            return satck[crown];        }        return -1;    }    //重置栈    public void  reset(){        crown = -1;    }    //打印栈 , 从栈顶开始打印    public void print(){        int j = 0;        for (int i = crown; i >= 0; i--) {            System.out.println("第"+(++j)+"个元素为:" + satck[i]);        }    }}
/** * @author 发着呆看星 * @create 2023/4/18 **/public class ArrayStackTest {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        ArrayStack arrayStack = new ArrayStack(5);        boolean p = true;        while (p){            System.out.println("==================栈的功能检测===================");            System.out.println("1) 入栈");            System.out.println("2) 出栈");            System.out.println("3) 重置栈");            System.out.println("4) 打印栈");            System.out.println("5) 取出栈顶元素");            System.out.println("6) 退出程序");            System.out.print("请选择你需要的功能(1~~6):");            int i = scanner.nextInt();            int j;            switch (i){                case 1:                    System.out.print("请选择你要入栈的数字:");                    j = scanner.nextInt();                    arrayStack.push(j);                    break;                case 2:                    arrayStack.pop();                    break;                case 3:                    arrayStack.reset();                    break;                case 4:                    arrayStack.print();                    break;                case 5:                    int top = arrayStack.getTop();                    System.out.println("栈顶元素为:"+top);                    break;                case 6:                    p = false;                    break;            }        }    }}

链表实现栈

  • 实现思路
    • 入栈:将每一个入栈的元素添加为链表的首节点
    • 出栈:出栈则将链表的首节点进行删除
    • 由于链表可以无限长,所以不用担心栈满的问题
  • crown:代表栈顶元素的上一个元素 ,val属性默认为 -1 ,next 属性即为 栈顶元素
    • 当 next == null 时 ,代表空栈
  • 判断栈是否为空
    • 当crown.next == null 时 ,栈为空
  • 重置栈
    • 即将 crown的next属性置为null
  • 获取栈顶元素
    • 即获取链表首节点(获取crown的next属性所代表的节点)
  • 打印栈
    • 即遍历链表



/** * @author 发着呆看星 * @create 2023/4/18 **/public class LinkedListStack {    private ListNode crown = new ListNode(-1,null);    // 判断是否为空    public boolean isEmpty(){        return crown.next == null;    }    // 入栈操作    public void push(int value){        ListNode temp = crown.next;        crown.next = new ListNode(value, temp);    }    // 出栈操作    public void pop(){        if (!isEmpty()){            crown.next = crown.next.next;        }    }    // 取出栈顶元素    public ListNode getTop(){        return crown.next;    }    // 重置栈    public void reset(){        crown.next = null;    }    // 打印栈 ,从栈顶开始    public void print(){        ListNode temp = crown;        int i = 0;        while (temp.next != null){            System.out.println("第"+(++i)+"个元素为:"+temp.next.val);            temp = temp.next;        }    }}
/** * @author 发着呆看星 * @create 2023/4/18 **/public class LinkedListStackTest {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        LinkedListStack stack = new LinkedListStack();        boolean p = true;        while (p){            System.out.println("==================栈的功能检测===================");            System.out.println("1) 入栈");            System.out.println("2) 出栈");            System.out.println("3) 重置栈");            System.out.println("4) 打印栈");            System.out.println("5) 取出栈顶元素");            System.out.println("6) 退出程序");            System.out.print("请选择你需要的功能(1~~6):");            int i = scanner.nextInt();            int j;            switch (i){                case 1:                    System.out.print("请选择你要入栈的数字:");                    j = scanner.nextInt();                    stack.push(j);                    break;                case 2:                    stack.pop();                    break;                case 3:                    stack.reset();                    break;                case 4:                    stack.print();                    break;                case 5:                    ListNode top = stack.getTop();                    System.out.println("栈顶元素为:"+top);                    break;                case 6:                    p = false;                    break;            }        }    }}

春去秋来,岁岁平安