Stack和Queue 栈和队列

目录

一、栈(Stack)

1.概念

2.栈的使用

3.栈的模拟实现

初始化

压栈(入栈)

弹出栈顶元素(出栈)

peek操作

获取栈元素个数

栈的练习--反转链表

二、队列(Queue)

概念

队列的使用

队列的模拟实现

初始化

入队

出队

peek() 

判断队列是否为空

循环队列

循环结构

代码实现

初始化

isFull() 和 isEmpty()

入队

出队

peek()

获取队尾元素

三、双端队列

概念


一、栈(Stack)

1.概念

        一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则

栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。

2.栈的使用

方法 功能
Stack() 构造一个空栈
E push(E e) 讲e入栈,并返回e
E pop() 讲栈顶元素出栈并返回
E peek() 获取栈顶元素
int size() 获取栈中元素个数
boolean isEmpty() 判断栈是否为空

3.栈的模拟实现

底层用数组

初始化

    public int[] elem;
    //当前栈 当中 存储的有效的数据个数  也可以当中  当前可以存放数据元素的下标
    public int usedSize;

    public static final int DEFAULT_CAPACITY = 10;

    public MyStack() {
        elem = new int[DEFAULT_CAPACITY];
    }

压栈(入栈)

在进行此步操作是需要判断数组是否已满,来确定是否需要扩容操作。

/**
     * 压栈
     */
    public void push(int val) {
        //1、判断栈是否是满的
        if(isFull()) {
            elem = Arrays.copyOf(elem,2*elem.length);
        }
        //存放到当前的下标,同时usedSize需要自增
        elem[usedSize] = val;
        usedSize++;
    }

    /**
     * 判断 当前栈是否是满的
     * @return
     */
    public boolean isFull() {
        if(usedSize == elem.length) {
            return true;
        }
        return false;
    }

弹出栈顶元素(出栈)

此步需要判断此时栈是否为空,以为栈为空的话无法弹出元素。

    /**
     * 删除栈顶元素
     * @return
     */
    public int pop(){
        if(isEmpty()) {
            throw new EmptyStackException("栈为空了!");
        }
        int oldVal = elem[usedSize-1];
        usedSize--;
        return oldVal;
    }

    /**
     * 是否为空
     * @return
     */
    public boolean isEmpty() {
        return usedSize == 0;
    }

peek操作

这里也需要判空。

    /**
     * 获取栈顶元素 但是不删除
     * @return
     */
    public int peek() {
        if(isEmpty()) {
            throw new EmptyStackException("栈为空了!");
        }
        return elem
  • 49
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 44
    评论
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

即将秃头的菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值