栈与队列简介

简介: 栈与队列简介

栈与队列和数组、链表、树这几种数据结构不太一样。栈与队列主要是做为程序员的工具来使用,它们主要做为构思算法的辅助工具,而不是完全的数据存储工具。

它们的生命周期比数组那些要短得多,在程序执行期间它们才会被创建,任务执行完就会被销毁。

一 栈

栈是一种只能在一端进行插入和删除数据的数据结构,这一端被称为栈顶(top)。其特点简单来讲就是先进后出。栈的主要机制可以用数组来实现,当然也可以用链表来实现。

用数组实现栈,并完成常用操作——出栈、入栈、查看元素(只能查看栈顶元素)、判断栈是否为空等操作。

public class StackTest {
    
    private long[] arr;
    // 栈顶
    private int top;

    public StackTest(){
        arr = new long[10];
        top = -1;
    }
    public StackTest(int maxsize){
        arr = new long[maxsize];
        top = -1;
    }

    /**
     * 添加数据
     * @param value
     */
    public void push(int value){
        arr[++top] = value;
    }

    /**
     * 移除数据
     * @return
     */
    public long pop() {
        return arr[top--];
    }

    /**
     * 查看数据
     * @return
     */
    public long peek(){
        return arr[top];
    }
    public boolean isEmpty(){
        return top == -1;
    }

    /***
     * 判断是否满了
     * @return
     */
    public boolean isFull(){
        return top == arr.length-1;
    }
}

栈的所有操作复杂度都为O(1),栈的操作不依赖栈中元素大小,栈不需要移动和比较操作。

二 队列

队列的特点是先进先出。队列也是用数组来实现。

用数组实现队列,并完成常用操作——出队、入队、查看元素、判断队列是否为空等操作。

public class QueueTest {

    private long[] arr;
    // 有效数据的大小
    private int elements;
    // 队头
    private int front;
    // 队尾
    private int end;

    public QueueTest(){
        arr = new long[10];
        elements = 0;
        front = 0;
        end = -1;
    }

    public QueueTest(int maxsize){
        arr = new long[maxsize];
        elements = 0;
        front = 0;
        end = -1;
    }

    /**
     * 插入数据
     * @param value
     */
    public void insert(long value){
        arr[++end] = value;
        elements++;
    }

    /**
     * 删除数据
     * @return
     */
    public long remove(){
        elements--;
        return arr[front++];
    }

    /**
     * 查看数据,从对头查看
     * @return
     */
    public long peek(){
        return arr[front];
    }

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

    public boolean isFull(){
        return elements == arr.length;
    }
}

队列的插入、删除等操作的复杂度都为O(1)。

三 优先级队列

优先级队列和普通队列一样,也是一个队头,一个队尾,从队头移除元素,优先级队列中,数据项是有序的,这样插入数据的时候就会根据某种规则去比较,然后插入到队列合适的位置。因此,优先级队列插入的复杂度为O(N),删除和查看元素的复杂度为O(1)。

用数组实现优先级队列,并完成常用操作——出队、入队、查看元素、判断队列是否为空等操作。

public class FirstQueueTest {

    private long[] arr;
    // 有效数据的大小
    private int elements;
    // 队头
    private int front;
    // 队尾
    private int end;

    public FirstQueueTest(){
        arr = new long[10];
        elements = 0;
        front = 0;
        end = -1;
    }

    public FirstQueueTest(int maxsize){
        arr = new long[maxsize];
        elements = 0;
        front = 0;
        end = -1;
    }

    /**
     * 插入数据
     * @param value
     */
    public void inser(long value){
        if(elements == 0){
            arr[++end] = value;
            elements++;
        }else{
            // 按某种规则进行比较,这里使用value的大小比较,按从小到大排序
            for(int i = elements-1;i>=0;i--){
                if(value<arr[i]){
                    arr[i+1] = arr[i];
                    arr[i] = value;
                }else{
                    arr[i+1] = value;
                    break;
                }
            }
            elements++;
            end++;
        }
    }

    /**
     * 删除数据
     * @return
     */
    public long remove(){
        elements--;
        return arr[front++];
    }

    /**
     * 查看数据,从对头查看
     * @return
     */
    public long peek(){
        return arr[front];
    }

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

    public boolean isFull(){
        return elements == arr.length;
    }
}

四 总结

  1. 栈的特点是先进后出,栈只能查看栈顶的一个元素
  2. 队列的特点是先进先出,只能查看队头的一个元素
  3. 优先级队列插入一条元素,平均需要移动2/N个元素,因此插入的复杂度为O(N)
  4. 栈和队列,可以用数组实现,也可以用其他数据结构实现
  5. 栈和队列是为了完成某些工作,手动构造的数据结构

点关注、不迷路

如果觉得文章不错,欢迎关注点赞收藏,你们的支持是我创作的动力,感谢大家。

如果文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改

目录
相关文章
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
218 9
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
37 1
|
29天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
55 5
|
1月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
1月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
1月前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
52 4
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
50 0
|
2月前
数据结构(栈与列队)
数据结构(栈与列队)
23 1
|
2月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
48 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器