IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构-队列(Queue)-定义与基本操作 -> 正文阅读

[数据结构与算法]数据结构-队列(Queue)-定义与基本操作

一. 循环队列(Loop Queue)

1. 定义

#define MaxSize 10								// 定义队列中元素的最大个数
typedef struct {
    int data[MaxSize];  						// 存放队列元素
    int front, rear;    						// 队头指针和队尾指针
}SqQueue;

2. 基本操作

2.1 初始化

// 初始化
void InitQueue(SqQueue &Q) {
    Q.front = Q.rear = 0;						// 初始化队头指针和队尾指针
}

2.2 入队

// 入队
bool EnQueue(SqQueue &Q, int x) {
    if ((Q.rear + 1) % MaxSize == Q.front) {	// 队满
        return false;
    }
    Q.data[Q.rear] = x;                         // 新元素插入队尾
    Q.rear = (Q.rear + 1) % MaxSize;            // 队尾指针向前移动
    return true;
}

2.3 出队

// 出队
bool DeQueue(SqQueue &Q, int &x) {
    if (Q.front == Q.rear) {                    // 队空
        return false;
    }
    x = Q.data[Q.front];						// x记录队头元素
    Q.front = (Q.front + 1) % MaxSize;			// 队头指针向前移动
    return true;
}

2.4 取队头元素

// 取队头元素
bool GetHead(SqQueue Q, int &x) {
    if (Q.front == Q.rear) {                    // 队空
        return false;
    }
    x = Q.data[Q.front];						// x记录队头元素
    return true;
}

2.5 判空

// 判断空队列
bool QueueEmpty(SqQueue Q) {
    return Q.front == Q.rear;
}

二. 链队列(Linked Queue)

1. 定义

typedef struct QueueNode {                       // 定义链队列结点数据类型
    int data;                                    // 数据域
    struct QueueNode *next;                      // 指针域
}QueueNode;

typedef struct {                        		// 链队列
    QueueNode *front, *rear;            		// 队头指针和队尾指针
}LinkQueue;

2. 基本操作

2.1 初始化

// 初始化(带头结点)
void InitQueue(LinkQueue &Q) {
	// 创建头结点,初始时front、rear都指向头结点。
    Q.front = Q.rear = (QueueNode *)malloc(sizeof(QueueNode));  
    Q.front->next = NULL;
}

2.2 入队

// 入队(带头结点)
void EnQueue(LinkQueue &Q, int x) {
    QueueNode *p = (QueueNode *)malloc(sizeof(QueueNode));
    p->data = x;
    p->next = NULL;
    Q.rear->next = p;                   		// 新结点p插入队尾
    Q.rear = p;                         		// 修改队尾指针指向p
}

2.3 出队

// 出队(带头结点)
bool DeQueue(LinkQueue &Q, int &x) {
    if (Q.front == Q.rear) {					// 队空
        return false;                    		
    }
    QueueNode *p = Q.front->next;				// p为队头结点
    x = p->data;                        		// x记录队头元素
    Q.front->next = p->next;            		// 修改队头指针指向下一个结点
    // 如果p为队尾结点,则出队后变为空队。
    if (Q.rear == p) {
        Q.rear = Q.front;
    }
    free(p);                            		// 释放原队头结点的空间
    return true;
}

2.4 取队头元素

// 取队头元素(带头结点)
bool GetHead(LinkQueue &Q, int &x) {
    if (Q.front == Q.rear) {            		// 队空
        return false;
    }
    QueueNode *p = Q.front->next;       		// p为队头结点
    x = p->data;                        		// x记录队头元素
    return true;
}

2.5 判空

// 判断空队
bool QueueEmpty(LinkQueue Q) {
    return Q.front == Q.rear;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-07 11:50:56  更:2021-07-07 11:51:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:18:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码