数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】(二)

简介: 数据结构—栈与队列【顺序存储、链式存储、卡特兰数、优先级队列】

(四) 链栈


         一、什么是链栈?


                       使用链式存储的栈,就是链栈。


                       插入和删除操作在栈顶进行,也就是链表的尾端。


                       存储单元由2部分组成:数据域 data 和指针域 next 。


                        使用top栈顶指针用于指向栈尾


ff455bc4b417406bb8f8f4eb77df216f.png

二、链栈类 【LinkStack】

package data.linear_table.stack_queue;
import data.linear_table.node.Node;
//链栈类
public class LinkStack implements IStack {
    private Node top ;      //栈顶元素的引用
    //将栈置空
    @Override
    public void clear() {
        top = null ;
    }
    //判断链栈是否为空
    @Override
    public boolean isEmpty() {
        return top == null ;
    }
    //求链栈的长度
    @Override
    public int length() {
       //{...} 
        return 0 ;
    }
    //取栈顶元素并返回其值
    @Override
    public Object peek() {
        //栈如果不为空
        if (!isEmpty()) {
            //返回栈顶元素
            return top.data ;
        }else {
            return null ;
        }
    }
    //入栈
    @Override
    public void push(Object x) throws Exception {
        //{...}             
    }
    //出栈
    @Override
    public Object pop() {
        // {...}
        return null ;
    }
    //输出栈中所有数据元素(从栈顶元素到栈底元素)
    public void display() {
        Node p = top ;          //初始化,p指向栈顶元素
        while (p != null ) {    //输出所有非空结点的数据元素值
            System.out.print(p.data.toString()+" ");
            p = p.next ;        //p指针向后移
        }
    }
}


注: 代码中 ” {....}“ 处,会在后面单独进行讲解。


1. public class LinkStack {
2. private Node top;      //栈顶指针
3. }


算法:链栈的长度

  //求链栈的长度
    @Override
    public int length() {
        Node p = top ;      //初始化,p指向栈顶元素
        int length = 0 ;    //length为计数器
        //从栈顶元素开始向后查找,直到p为空
        while (p != null ) {
            p = p.next ;    //p指向后继结点
            length++ ;      //长度增加1
        }
        return length ;
    }

算法:入栈

public void push(Object x) {
    Node p = new Node(x);   // 创建新结点p
    p.next = top;    // 1.p的指针域指向栈顶元素
    top = p;      // 2.栈顶指针top指向新结点p
}

算法:出栈

public Object pop() {
    if(top == null) {     //空栈 isEmpty()
        return null; 
    } else {
        Node p = top;       // 1 存放栈顶元素
        top = top.next;     // 2 将top指向栈顶的下一个元素
        return p.data;      // 3 返回栈顶元素数据
    }
}

(五) 队列


       一、什么是队列?


                        队列是一个特殊的线性表。


                       只允许在队尾进行插入操作


                        只允许在队首进行删除操作


----------------------------------------------------------------------------


        二、队列的相关术语?


                        队尾rear:进行插入操作的一端。


                        队首front :进行删除操作的一端


                       入队offer : 进行插入操作,称为入队


                       出队 poll : 进行删除操作 , 称为出队

b54d5e43866e49c9bb9bab5116282360.png

三、 队列有哪两种存储方式 ?


                        使用顺序存储的称为顺序队列 。


                        使用链式存储的称为链队列 。


----------------------------------------------------------------------------


四、队列的抽象数据类型Java接口【IQueue】

package data.linear_table.stack_queue;
//队列的抽象数据类型Java接口
public interface IQueue {
    public void clear() ;   //置队成空队列
    public boolean isEmpty() ;  //判断队列是否为空
    public int length() ;   //队列中数据元素的个数
    public Object peek() ;  //取队列首元素
    public   void offer(Object x) throws Exception;  //将元素x插入到队列中使用成为新的队尾元素
    public Object poll() ;   //删除对首元素并返回其值。若队列为空,则返回null
}

(六) 顺序队列


        一、什么是顺序队列?


·                         顺序队列的存储结构中,需要分配一块地址连续的存储区域来一次存放队列中从队首到队尾的所有元素。


        二、关于队列的那些操作?


                        front表示队首,进行出队操作时,front进行计数。


                       rear表示队尾,进行入队操作时,rear进行计数。


                        front == rear == 0 为空队列。


                       入队操作:


97f2b06a3cfa441581b797823a33890a.png


                        出队操作:

11d71d82684b4f0f8e4fcfb6b5b52051.png

     


         三、队列存在的问题“假溢出”


                        因为顺序队列的多次入队和出队操作后出现有存储空间,但是又不能顺序入队的溢出现象,称为“假溢出”。


                       假溢出,数组的最后一个元素已经添加数据,但队列没有满 。


1a4d37f3e92849799b477f76a348d5ec.png


                         解决方案:使用循环队列解决“假溢出”问题。将顺序队列所使用的存储空间看成是一个逻辑上首尾相连的循环队列。


915b2a20d4a04a808ca2b6f621cfb4bc.png


 ----------------------------------------------------------------------------


(七) 循环顺序队列


        一、什么是循环顺序队列?


                        在逻辑上队首和队尾连接在一起。


                       存在的问题:队首front和队尾rear重叠时,无法区分队满还是队空。


193344d7c4e04c8ab91dbe5c00df04f6.png


                        解决方案 :


                               方案1:设计一个计数器,出入队累计法。(整数变量num,入队+1,出队-1,如果num=0就是空)。判断条件为:num == 0 为队空;num > 0 && front == rear 为队满。


                               方案2:设计一个标识变量法。(flag=0出队,flag=1入队,重叠后0表示空,1表示满)。判断条件为:front == rear && flag == 0 为队空;front == rear && flag == 1 为队满。


                               方案3:少用一个存储单位。当顺序存储空间为maxSize时,只允许最多存放maxSize -1个数据元素。判断条件为:


// 队列空
front == rear;
// 队列满
(rear + 1) % maxSize == front;

2d861fd7d7944b75a6b8cf994c0267b8.png

详解   front == (rear+1) % maxSize 为 队满 :

547c5864a6e045ba884d7ecfd8cf5925.png




相关文章
|
23天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
109 9
|
13天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
22 1
|
16天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
19天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
21天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
47 4
|
25天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
数据结构(栈与列队)
数据结构(栈与列队)
20 1
|
1月前
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
1月前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
71 1
|
1月前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
17 0