首页 > 其他分享 >【数据结构-队列】队列的基本操作

【数据结构-队列】队列的基本操作

时间:2022-10-24 23:24:04浏览次数:57  
标签:队尾 结点 return 队列 front 基本操作 数据结构 rear 指针

目录

1 顺序表实现队列(循环队列)

实现方式:

  • 队尾指针指向队尾元素
  • 队尾指针指向队尾元素的下一位置(队头指针在队尾指针的下一个位置作为队满标志

1.1 定义

  • 队尾指针指向队尾元素:
# define MAX 50 // 队列的容量

typedef struct Queue{
    int data[MAX];
    int size; // 增设记录队列当前元素的个数
    int front, rear;
} Queue;
  • 队尾指针指向队尾元素的下一位置:
# define MAX 50 // 队列的容量

typedef struct Queue{
    int data[MAX];
    int front, rear;
} Queue;

1.2 初始化

  • 队尾指针指向队尾元素:
void InitQueue (Queue &Q){
    Q.front = 0;
    Q.rear = MAX-1;
    Q.size = 0;
}
  • 队尾指针指向队尾元素的下一位置:
void InitQueue (Queue &Q){
    Q.front = 0;
    Q.rear = 0;
}

1.3 判队空

  • 队尾指针指向队尾元素:
bool EmptyQueue (Queue &Q){
    if (Q.size == 0)
        return true;
    else
        return false;
}
  • 队尾指针指向队尾元素的下一位置:
bool EmptyQueue (Queue &Q){
    if (Q.front == Q.rear)
        return true;
    else
        return false;
}

1.4 判队满

  • 队尾指针指向队尾元素:
bool FullQueue (Queue &Q){
    if (Q.size == MAX)
        return true;
    else
        return false;
}
  • 队尾指针指向队尾元素的下一位置:
bool FullQueue (Queue &Q){
    if ((Q.rear+1) % MAX == Q.front)
        return true;
    else
        return false;
}

1.5 出队

  • 队尾指针指向队尾元素:
bool DeQueue (Queue &Q, int &x){
    if (Q.size == 0)
        return false;
    
    x = Q.data[Q.front]; // 获得出队元素
    Q.front = (Q.front+1) % MAX; // 队头指针加 1
    return true;
}
  • 队尾指针指向队尾元素的下一位置:
bool DeQueue (Queue &Q, int &x){
    if (Q.front == Q.rear)
        return false;
    
    x = Q.data[Q.front]; // 获得出队元素
    Q.front = (Q.front+1) % MAX; // 队头指针加 1
    return true;
}

1.6 入队

  • 队尾指针指向队尾元素:
bool EnQueue (Queue &Q, const int x){
    if (Q.size == MAX)
        return false;
    
    Q.rear = (Q.rear+1) % MAX; // 队尾指针加 1
    Q.data[Q.rear] = x; // 入队
    return true;
}
  • 队尾指针指向队尾元素的下一位置:
bool EnQueue (Queue &Q, const int x){
    if ((Q.rear+1) % MAX == Q.front)
        return false;
    
    Q.data[Q.rear] = x; // 入队
    Q.rear = (Q.rear+1) % MAX; // 队尾指针指向下一个位置
    return true;
}

1.7 队长

int LenQueue (Queue &Q){
    return (Q.rear - Q.front + MAX) % MAX;
}

2 单向链表实现队列

单向链表实现队列:链表头出队,链表尾入队。

实现方式:

  • 不带头结点
  • 带头结点(头结点可存储当前队列的元素个数

2.1 定义

  • 不带头结点:
#define MAX 50 // 队列的容量

typedef struct LinkNode{
    int data;
    struct LinkNode *next;
}LinkNode;

typedef struct Queue{
    int size; // 增设记录队列当前元素的个数
    struct LinkNode *front;
    struct LinkNode *rear;
}LinkQueue;
  • 带头结点:
#define MAX 50 // 队列的容量

typedef struct LinkNode{
    int data;
    struct LinkNode *next;
}LinkNode;

typedef struct Queue{
    // struct LinkNode *front; // 队头指针可由头结点指针充当实现
    struct LinkNode *rear;
    struct LinkNode *head; // 头结点指针
}LinkQueue;

2.2 初始化

  • 不带头结点:
void InitQueue (LinkQueue &Q){
    Q.front = NULL;
    Q.rear = NULL;
    Q.size = 0;
}
  • 带头结点:
void InitQueue (LinkQueue &Q){
    Q.head = (LinkNode *) malloc(sizeof(LinkNode)); // 创建头结点
    Q.rear = Q.head; // 初始时,队头指针和队尾指针指向头结点
    Q.head->data = 0; // 记录队列当前元素个数
    Q.head->next = NULL;
}

2.3 判队空

  • 不带头结点:
bool EmptyQueue (LinkQueue &Q){
    if ((Q.front == NULL) || (Q.rear == NULL))
        return true;
    else
        return false;
}

bool EmptyQueue (LinkQueue &Q){
    if (Q.size == 0)
        return true;
    else
        return false;
}
  • 带头结点:
bool EmptyQueue (LinkQueue &Q){
    if (Q.head->data == 0)
        return true;
    else
        return false;
}

bool EmptyQueue (LinkQueue &Q){
    if (Q.head == Q.rear)
        return true;
    else
        return false;
}

2.4 判队满

  • 不带头结点:
bool FullQueue (LinkQueue &Q){
    if (Q.size == MAX)
        return true;
    else
        return false;
}
  • 带头结点:
bool FullQueue (LinkQueue &Q){
    if (Q.head->data == MAX)
        return true;
    else
        return false;
}

2.5 出队

  • 不带头结点:
bool DeQueue (LinkQueue &Q, int &x){
    LinkNode *frontNext; // 记录队头指针的下一个结点

    if ((Q.front == NULL) || (Q.rear == NULL)) // 判空,或:Q.size == 0
        return false;
        
    x = Q.front->data;
    
    if (Q.front == Q.rear){ // 若队列只有一个结点
        free(Q.front);
        Q.front = NULL;
        Q.rear = NULL;
    }
    else{ 
        frontNext = Q.front->next; // 记录队头指针的下一个结点
        free(Q.front);
        Q.front = frontNext; // 更新队头指针
    }
    
    Q.size--; // 出队,减少一个元素
    return true;
}
  • 带头结点:
bool DeQueue (LinkQueue &Q, int &x){
    LinkNode *front = Q.head->next; // 队头指针

    if (Q.head == Q.rear) // 判空,或:Q.head->data == 0
        return false;
        
    x = front->data;
    
    Q.head->data--; // 出队,减少一个元素
    Q.head->next = front->next; // 头结点的指针域指向队头结点的下一个结点
    if (front == Q.rear) // 若队列只有一个结点,出队后只剩头结点
        Q.rear = Q.head; // 队尾指针指向头结点
    free(front);
    return true;
}

2.6 入队

  • 不带头结点:
bool EnQueue (LinkQueue &Q, const int x){
    LinkNode *newNode;

    if (Q.size == NUM) // 判满
        return false;
        
    newNode = (LinkNode *) malloc(sizeof(LinkNode));
    newNode->data = x;
    newNode->next = NULL;
    
    if ((Q.front == NULL) || (Q.rear == NULL)){ // 如果队列为空 // 或:Q.size == 0
        Q.front = newNode;
        Q.rear = newNode;
    }
    else{
        Q.rear->next = newNode; // 队尾指针的指针域指向新结点
        Q.rear = newNode; // 队尾指针指向新结点
    }
    
    Q.size++; // 入队,增加一个元素
    return true;
}
  • 带头结点:
bool EnQueue (LinkQueue &Q, const int x){
    LinkNode *newNode;

    if (Q.head->data == NUM) // 判满
        return false;
        
    newNode = (LinkNode *) malloc(sizeof(LinkNode));
    newNode->data = x;
    newNode->next = NULL;
    
    Q.head->data++; // 入队,增加一个元素
    Q.rear->next = newNode; // 队尾指针的指针域指向新结点
    Q.rear = newNode; // 队尾指针指向新结点
    return true;
}

标签:队尾,结点,return,队列,front,基本操作,数据结构,rear,指针
From: https://www.cnblogs.com/Mount256/p/16823427.html

相关文章

  • 阻塞队列介绍
    阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列......
  • 数据结构---二叉树
    二叉树的结构体:左右子树指针(Tree*) 值(int)typedefstructTree{chardata;structTree*lchild,*rchild;}*BiTree;二叉树的先序创建BiTreeCreate(......
  • 数据结构 数组动态数组
    数据结构:批量管理和维护数据。一维数组string[]Name=newstring[3];string数组存储的数据类型,Name数组名称new通过new操作符返回新数组对象string[3]定义数组的元......
  • Codeforces Round #830 (Div. 2)D2. Balance (Hard version)(数据结构)
    题目链接题目大意维护一个集合的mex,每次有三种操作:'+'x:将数x插入集合中'-'x:将数x移除集合'?'k:询问满足mex的数是k的倍数既集合中未出现的数中最小的数......
  • 『现学现忘』Git分支 — 40、分支基本操作(一)
    目录1、创建分支(1)创建分支(2)图示理解2、查看分支列表3、分支切换4、查看所有分支的最后一个提交5、删除分支1、创建分支(1)创建分支Git是怎么创建新分支的呢?很简单,就是要......
  • 什么是算法和数据结构
    【1】算法(1)可以解决具体问题:例如1+2+3+4+。。。+99+100解题流程=算法(2)有设计解决的具体流程算法1: 1+2=3 3+3=66+4=10.。。加到100--->5050算法2:(1*100*50=101*5......
  • 数据结构#1 笛卡尔树学习笔记
    笛卡尔树数据结构结构介绍笛卡尔树是一种树形的数据结构,它的每一个节点都有两个值key和weight,其中key满足二叉搜索树的性质,而weight满足堆的性质。在使用时,我们通常将ke......
  • vim 工作区的基本操作
    vim工作区的操作多窗口:sp新文件名水平窗口打开一个新文件:vs新文件名垂直窗口打开一个新文件光标在多窗口之间的移动ctrl+w,h 向左ctrl+w,j......
  • Redis 02: redis基础知识 + 5种数据结构 + 基础操作命令
    Redis基础知识1)、测试redis服务的性能:redis-benchmark2)、查看redis服务是否正常运行:ping如果正常---pong3)、查看redis服务器的统......
  • 数据结构【C语言版】二叉树的结构和遍历的实现
    数据结构【C语言版】二叉树的结构和遍历的实现1.二叉树的存储结构二叉树一般分为两种存储结构,一种是顺序结构,一种是链表结构。顺序结构顺序结构存储就是使用数组来......