数据结构栈和队列

本文详细介绍了数据结构中的栈和队列。栈遵循先进后出原则,常用于回溯历史,如递归逻辑和网页回退功能。队列则遵循先进先出原则,适用于历史重演场景,如线程等待队列。文章还讨论了如何通过循环队列解决队列容量浪费的问题,并提供了Java实现队列的代码示例。此外,双端队列和优先队列作为队列的变体也进行了简单介绍。
摘要由CSDN通过智能技术生成

数据结构结构

数据结构分为,物理结构逻辑结构。
数组和链表是内存中存在的是物理结构,栈和队列是逻辑结构,逻辑机构是抽象概念,需要依赖物理结构得以存在。

一:栈

(先进后出)(java当中的 Stack类就是栈)
栈是一种线性数据结构,遵从先进后出的原则。
栈底:最早进入的元素叫做栈底。
栈顶:最后进入的元素叫做栈顶。
入栈,出栈只考虑第一个和最后一个。时间复杂度都为O(1)
补充:(java当中的 Stack工具类就是栈,push() 入栈、pop() 出栈)

二:队列

(先进先出)
队列是一种线性数据结构,遵从先进先出的原则。
队头:第一个进来的元素叫做队头
队尾:最后一个进来的元素叫队尾
问题:队列先进先出,使用数组实现。每次对头出队后,前面的容量会一直空着。导致后面不停入队,容量不停扩大。
答:采用循环队列模式。
reat=reat + 1%array.length:
向后移动一位,如果到了数组最后位置,就会从数组下标0开始。 时间复杂度都为O(1)

双端队列:队头、队尾都可以入队,出队
优先队列:根据列表中元素的优先级决定出队

三:什么时候用栈和队列

栈:

栈是回溯历史,比如说递归逻辑。就可以用栈来代替 面包屑导航:比如说网页导航,回退功能,一直回退到上一级。

队列:

队列是历史的重演,比如说多线程争夺公平锁的等待队列,就是按照访问顺序来获取线程在队列中的次序的。

四:队列的java代码实现

/**
 *   队列:遵循先进先出
 */
public class Queue {
    private int [] array;  //定义数组
    private int front ;     //定义队头
    private int reat;  //定义队尾

    public  Queue(int capactiy){
        this.array = new int[capactiy];
    }

    /**
     *      入队
     * @param element  入队元素
     * @throws Exception
     */
    public void enqueue(int element) throws Exception{
        if((reat+1)%array.length==front){   //拿到对队尾的下一个是不是队头
            throw new Exception("队列已满");
        }
        array[reat]=element;
        reat=reat + 1%array.length;
    }

    /**
     *  出队
     * @return
     * @throws Exception
     */
    public int dequeue()throws Exception {
        if(reat==front){  //队头等于队尾  队列为空
            throw new Exception("队列为空");
        }
       int  element= array[front];
        front=front + 1 % array.length;  //将对头向后移动一位
        return element;
    }

    public void SystemArray() {
        for (int i=front; i!=reat; i=i+1%array.length){
            System.out.println(array[i]);
        }
    }

    public static void main(String[] args) throws Exception{
        Queue queue=new Queue(4);
        queue.enqueue(1);
        queue.enqueue(2);
        queue.enqueue(3);
//        queue.enqueue(4);   //队列长度比数组小 1
            queue.dequeue();  //先进先出,
        queue.SystemArray();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值