用链表Linklist 来实现队列(queue)队列可以用数组(ArrayList)或者链表(Linklist)来实现,队列(queue)是(先进先出(FIFO))擅长删除,插入数据。[ 建议在思考下面节点的指向时用画图会更清楚直观 ]
用Linklist来实现队列(queue)先创建一个MyLinkList 类 代码如下:
public class MyLinkList<E>{ } //(E)是泛型 在还没确定往队列里面存放什么数据的时候,用泛型,这样等到对象创建是可以确定任意的类型
创建节点个数为0的来链表 代码如下:
public class MyLinkList<E>{ Node head = null; Node last =null; int num; //定义num来计数 链表中的节点数 }
在创建节点时候用到Node 节点类,所以我们需要自己写一个内部使用的节点类 Node在MyLinkList类中使用;
public class MyLinkList<E>{ Node head = null; Node last =null; int num; private class Node{ E e; //定义一个泛型的数据e Node next; //定义节点next public Node(E e){ //Node 带参数e的构造函数 this.e = e; } } }
创建2个类(MyLinkList)和(Node)后 可以写方法push(E e)将数据e 压入队列中
在用链表实现队列的时候记住链表是节点不是动态数组(Arraylist)连续的位置,链表需要节点指向下一个位置的节点 (例如节点n 是头节点head,n.next就是头节点下的第二个节点) 代码如下:
public void push(E e){ Node n = new Node(e); //’先创建一个节点n, (e)尾节点n中的数据; if(head ==null){ //先进行判断链表的头节点是否为空,如果为空,那么n 作为头节点,同时也是尾节点。 head = n; last = n; }else{ last.next = n; //如果不是为空,则将节点n 放到节点last后面(last.next), 同时n 也作为尾节点。 last = n; } num++; //节点数num自增。 }
public E get(){ return head == null?null:head.e; //采用三目运算符,进行判断头节点如果为空就输出null 否则输出head.e }
写好压入数据入队列的方法,再写一个将数据弹出来的方法poll() ,弹出数据和压入数据差不多,就是节点的指向不同。节点弹出又返回值,需要用泛型E
public E poll(){ if(head==null){ //先判断链表是否为空,如果为空则弹出空数据,返回 (return)一个null值。 return null; } Node n = head; //创捷一个新的节点n 指向head head = n.next; //头节点(head)和n 节点同时指向第一个节点,出队列 需要弹出第一个节点,就是节点n,所以 头节点需要指向下一个节点(head = n.next) n.next = null; //然后头节点n节点的下一个指向就为null,可以弹出。 num - -; //弹出数据,节点自减 return n.e; //返回节点n 上面的数据 e }
创建一个size()方法来返回节点数num
public int size(){ return num; //创建一个size()方法来返回节点数num }
创建一个可以弹出队列第一个数据的方法get() 代码如下:
public E get(){ return head == null?null:head.e; //采用三目运算符(?)进行判断,如果头节点为空就返回null,否则返回head.e }
返回方法除了用三目运算 也可以用流程控制语句(if else)进行判断。
上面的方法时不能查看队列里面的数据,但是可以运行,测试过没问题,数据可以放进去,也可以弹出来,是FIFO类型。
相关推荐
本主题关注的是如何使用C语言来实现数据结构中的栈和队列,这是两种基础但非常重要的抽象数据类型(ADT)。 栈(Stack)是具有后进先出(LIFO)特性的数据结构。它类似于一个堆叠的盘子,最新的元素被放在顶部,...
根据给定文件的信息,我们可以总结出关于“栈和队列的表示及实现”的知识点: ### 栈和队列的基本概念 #### 栈(Stack) - **定义**:栈是一种特殊的线性表,只允许在表的一端进行插入或删除操作。这一端称为栈顶...
实验中,我们使用链表来实现队列,并实现了队列的入队、出队和遍历操作。队列的实现需要注意队列的大小和元素的类型,否则可能会出现队列溢出或类型不匹配的问题。 ```c typedef struct queue{ int data; struct ...
因此,需要设计合适的算法来模拟实际的医疗系统,例如使用带有优先级别的队列来实现看病排队候诊问题。 解决看病排队候诊问题需要设计合适的数据结构和算法来模拟实际的医疗系统。通过使用链式队列和合适的算法,...
使用链表创建队列,简单的写的,初学者适用。
### 堆栈和队列(数据结构基本教程) #### 一、堆栈(Stack) ...- 堆栈和队列都可以使用链表或数组实现,其中链式实现更加灵活,而顺序实现则更加节省内存。循环队列通过对队列进行优化,使得队列空间的利用率更高。
在C++中,我们可以通过自定义结构体来实现事件表和队列。事件表用来记录顾客的进店和离店时间,通常包括两个字段:`OccurTime`(事件发生的时间)和`NType`(事件类型,如0表示顾客到达,1表示顾客离开)。队列则...
在Java中,可以使用`java.util.Queue`接口及其实现如`LinkedList`来创建队列。队列的主要操作包括添加元素(enqueue)、移除元素(dequeue)和检查队首元素。 栈则是一种后进先出(LIFO)的数据结构,常被用作临时...
在C++中,可以使用数组或链表来实现。例如,基于数组的简单队列: ```cpp class Queue { private: int capacity; int front, rear; int* arr; public: // 构造函数、入队、出队、检查队列是否为空等方法... }; ...
DataStructure 这里使用python3语言对数据结构进行实现 ch01 : 链表的实现 LinkList.py :含有指针的... queue_linklist.py :基于链表的队列实现 cycle_queue.py :基于python列表的循环队列实现
简单二叉树的功能实现//结构体以及全局变量声明区域 typedef int BoolStatus; typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; typedef ...
程序包括了多个头文件,例如 common.h、Linklist.h、Queue.h 和 simulation.h,分别定义了通用函数、链表类型、队列类型和仿真函数等。main 函数是程序的入口点,负责模拟理发店的排队过程,计算了客户的到达和离开...
**队列的设计与实现**:队列用于存储正在等待服务的客户信息,主要包括客户的业务类型(取款/借款或存款/还款)、所需金额等。 2. **链表的设计与实现**:链表用于记录所有客户的到达时间、业务类型以及最终的离开...
- 使用队列来模拟窗口前的客户队列,这里可以采用循环队列(Ring Queue)以避免特殊情况下的数组越界问题,并且易于实现客户在最短队列的插入。 2. **设计原理**: - 计算平均时间的关键在于跟踪每个客户的到达和...
2. 队列(Queue): `linkqueue` 结构体表示一个基于链表实现的循环队列,包含队头 `front` 和队尾 `rear` 指针。`SetNullQ` 函数用于初始化为空队列,`EmptyQ` 判断队列是否为空,`FrontQ` 返回队头元素但不删除,...
在C++中,顺序队列通常用数组来实现。它的操作包括入队(enqueue)、出队(dequeue)、查看队头元素(front)以及判断队列是否为空(isEmpty)。这个实验可能涉及了动态数组的扩展和队列的基本操作实现。 2. **Ex4_...
同时,使用队列(链表实现)来模拟车场外的便道,队首的车辆是最早到达的等待者。 - 当车辆到达时,如果停车场有空位,将其压入栈中,否则将其加入队列。当车辆离开时,需要弹出栈顶的车辆,并根据其在栈中的位置...
实验代码包括了`LinkList.cpp`、`CycleLinkList.cpp`、`Stack.cpp`和`Queue.cpp`四个文件,分别对应单链表、循环链表(可能用于链式队列的循环结构)、堆栈和队列的实现。 通过这个实验,学生能够深入理解链表、...
- `typedef struct {`:定义了一个队列结构体`Queue`,其中包含指向队首和队尾的指针(`LinkList front; LinkList rear;`),以及表示蛇长度的整型变量(`int length;`)。 ### 二、函数实现 #### 1. **屏幕定位...