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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> [leetcode]C语言用数组或链表实现循环队列 -> 正文阅读

[数据结构与算法][leetcode]C语言用数组或链表实现循环队列

实现循环队列,我们需要实现的操作:

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满

一、数组的方式实现循环队列

typedef struct {
	int *a;    //定义动态数组存储数据
	int front; 
	int tail;
	int capacity;//数据的存储容量
} MyCircularQueue;

//构造队列
MyCircularQueue* myCircularQueueCreate(int k) {
	MyCircularQueue*cp = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
	cp->a = (int*)malloc(sizeof(int)*(1 + k));//多开一个空间,方便判空和判满
	cp->front = cp->tail = 0;
	cp->capacity = k;
	return cp;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj);//写IsEmpty、IsFull函数声明,这样下列函数可以使用
bool myCircularQueueIsFull(MyCircularQueue* obj);
//插入元素
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
	if (myCircularQueueIsFull(obj))//判满,满了就返false
		return false;

	obj->a[obj->tail] = value;//赋值value
	obj->tail++;
	obj->tail %= (obj->capacity + 1);//保证tail在有效范围内
	return true;
}
//删除元素
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
	if (myCircularQueueIsEmpty(obj))//判满,满了就返false
		return false;

	obj->front++;
	obj->front %= (obj->capacity + 1);//保证front在有效范围内
	return true;
}
//获取队首元素
int myCircularQueueFront(MyCircularQueue* obj) {
	if (myCircularQueueIsEmpty(obj))
		return -1;

	return obj->a[obj->front];
}
//获取队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {
	if (myCircularQueueIsEmpty(obj))
		return -1;
	//方法1
	//int i = (obj->tail + obj->capacity) % (obj->capacity + 1);
	//return obj->a[i];
	//方法2
	 if(obj->tail==0)
	 return obj->a[obj->capacity];
	else
	 return obj->a[obj->tail-1];
}
// 检查循环队列是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
	return obj->front == obj->tail;
}
//检查循环队列是否已满
bool myCircularQueueIsFull(MyCircularQueue* obj) {
	return (obj->tail + 1) % (obj->capacity + 1) == obj->front;
}

void myCircularQueueFree(MyCircularQueue* obj) {
	free(obj->a);
	free(obj);
}

?二、链表的方式实现循环队列

//链表实现
typedef struct QNode
{
    int val;
    struct QNode *next;
}QNode;
typedef struct {
    QNode*front;
    QNode*tail;
    int capacity;//最大存储数
    int n;//实际存储数
} MyCircularQueue;
bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue*cp=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    cp->capacity=k;
    cp->front=cp->tail=NULL;
    cp->n=0;
    return cp;
}

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if( myCircularQueueIsFull(obj))
    return false;
        QNode *N = (QNode*)malloc(sizeof(QNode));
    N->next = NULL;
    N->val = value;

    if(obj->n==0)
    {
         obj->front=N;
         obj->tail=N;
    }
  
   else
   {
    obj->tail->next=N;
    obj->tail=obj->tail->next;
   }

   obj->n++;
   return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))
		return false;

    obj->front=obj->front->next;
        obj->n--;
        return true;
}

int myCircularQueueFront(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))
		return -1;

        return obj->front->val;
}

int myCircularQueueRear(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))
		return -1;

        return obj->tail->val;
}

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    if(obj->n==0)
    return true;
    else
    return false;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    if(obj->capacity==obj->n)
    return true;
    else
    return false;
}

void myCircularQueueFree(MyCircularQueue* obj) {
    if (myCircularQueueIsEmpty(obj))
		return ;
    QNode*head=obj->front;
   QNode*next=NULL;
    while(head->next)
    {
        next=head->next;
        free(head);
        head=next;
        
    }
    free(obj);
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:52:09  更:2021-11-30 15:53:53 
 
开发: 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/26 13:56:43-

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