Java数据结构:栈

- - 栈的概念

1.是一种线性表,插入和删除都只在栈顶进行。
2.压栈(push):栈顶插入一个元素。
出栈(pop):删除栈顶元素。
3.遵循“后进先出”的规则。Eg:子弹入弹夹,才把子弹从弹夹中打出。

在这里插入图片描述

- - 栈的使用:

在这里插入图片描述

    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(11);//压栈
        stack.push(22);
        stack.push(33);
        stack.push(44);

        Integer ret = stack.pop();//出栈    后进先出
        System.out.println(ret);

        int ret2 = stack.peek();//获取栈顶元素不删除    可用int表示拆包
        System.out.println(ret2);

        System.out.println(stack.size());//获取栈中有效元素的个数
    }

- - 栈的实现

public class Mystack {
    private int[] elem;//数组
    private int usedSize;//记录个数

    private static final int DEFAULT_SIZE = 10;

    public Mystack() {
        this.elem = new int[DEFAULT_SIZE];
    }

    public void push(int val){//入栈
        if(isFull()) {
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);//扩容
        }
        this.elem[this.usedSize] = val;
        this.usedSize++;
    }

    public boolean isFull(){//判满
        return  this.usedSize == this.elem.length;
    }
    public int pop() {
        if(isEmpty()) {
            throw new EmptyException();//抛一个空的异常
        }
        int oldval = this.elem[this.usedSize-1];//记录要被pop的栈顶元素
        this.usedSize--;//栈顶元素被pop,个数减1
        return oldval;
    }
    public boolean isEmpty() {//判空
        return this.usedSize == 0;
    }

    public int peak(){
        if(isEmpty()) {
            throw new EmptyException();
        }
        return this.elem[this.usedSize-1];//
    }
}
    public static void main1(String[] args) {
        Mystack mystack = new Mystack();
        mystack.push(12);
        mystack.push(23);
        mystack.push(34);
        mystack.push(45);

        System.out.println(mystack.peak());
        System.out.println(mystack.pop());
        System.out.println(mystack.pop());
        System.out.println(mystack.pop());
        System.out.println(mystack.isEmpty());
        System.out.println(mystack.pop());
        System.out.println(mystack.isEmpty());
    }
public class EmptyException extends RuntimeException {
    public EmptyException(){

    }

    public EmptyException(String message) {
        super(message);
    }

}

- - 关系:

在这里插入图片描述

在这里插入图片描述

- - 栈的应用

1.找出不可能出栈序列

在这里插入图片描述

在这里插入图片描述

2.逆序打印链表(将递归转化为循环)

递归:

    void printList(Node head) {
        if(head != null) {
            printList(head.next);
            System.out.println(head.val+" ");
        }
    }

栈循环:

    public void reversePrintList() {//利用栈的特性
        Stack<ListNode> stack = new Stack<ListNode>();
        ListNode cur = head;
        while(cur != null) {
            stack.push(cur);
            cur = cur.next;
        }

        while (!stack.isEmpty()) {
            ListNode top = stack.pop();
            System.out.print(top.val);
        }
    }

- - 栈、虚拟机栈、栈帧的区别:

在这里插入图片描述

- - 用链表实现栈

顺序栈用Stack
链式栈用LinkedList
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值