国外做3d模型的网站,关于加强网站建设,网页设计基础括号代码大全,东营网站app建设队列的的概念
队列是一种特殊的线性表#xff0c;特殊之处在于它只允许在表的头部进行删除操作#xff0c;而在表的尾部进行插入操作#xff0c;和栈一样#xff0c;队列是一种操作受限制的线性表。进行插入操作的端称为队尾#xff0c;进行删除操作的端称为队头。队列中…队列的的概念
队列是一种特殊的线性表特殊之处在于它只允许在表的头部进行删除操作而在表的尾部进行插入操作和栈一样队列是一种操作受限制的线性表。进行插入操作的端称为队尾进行删除操作的端称为队头。队列中没有元素时称为空队列。
队列的特点
先进先出这是队列最大的特点队列中所有的元素都遵循先进先出的原则进行管理数据最先入队列的一定会最先出队列。受限访问队列操作数据时只能对队头或者队尾进行操作。入队插入数据只会在队尾进行出队删除数据只会在对头进行。高效进行删除和插入数据最坏情况下的时间复杂度是O(1)。
队列的接口实现
队列可以使用数组和链表来实现但是链表实现起来更清晰。
队列的结构
typedef int QUEDATATYPE;typedef struct QueueNode
{QUEDATATYPE data;struct QueueNode* next;
}QUENODE;但是这样有个问题我每次插入都要找尾节点这样就太慢了所以我们就用两个指针来解决这个问题一个指针指向队列的头节点一个用来指向队列的尾节点。
typedef int QUEDATATYPE;typedef struct QueueNode
{QUEDATATYPE data;struct QueueNode* next;
}QUENODE;typedef struct Queue
{QUENODE* phead;QUENODE* ptail;int size;
}Queue;队列的初始化
//初始化队列
void QueueInit(Queue* pq)
{assert(pq);pq-phead pq-ptail NULL;pq-size 0;
}入队
入队操作在尾部进行
这里有有两个情况队列为空与非空。
为空的话就直接将新节点赋给phead和ptail。非空将ptail的next指针指向新节点再更新ptail。
//入队
void QueuePush(Queue* pq, QUEDATATYPE x)
{assert(pq);if (pq-phead NULL){QUENODE* Node (QUENODE*)malloc(sizeof(QUENODE));if (Node NULL){perror(malloc fail);exit(1);}Node-data x;Node-next NULL;pq-phead pq-ptail Node;}else{QUENODE* Node (QUENODE*)malloc(sizeof(QUENODE));if (Node NULL){perror(malloc fail);exit(1);}Node-data x;Node-next NULL;pq-ptail-next Node;pq-ptail Node;}pq-size;
}出队
出队操作在队头进行
出队同样也有两种情况只剩下一个节点和多个节点。
只有一个节点也就是只有头节点了直接将头节点释放掉就好了。多个节点将头节点释放更新头节点
//出队
void QueuePop(Queue* pq)
{assert(pq pq-size 0);if (pq-phead-next NULL){free(pq-phead);pq-phead pq-ptail NULL;}else{QUENODE* tmp pq-phead;pq-phead pq-phead-next;free(tmp);tmp NULL;}pq-size--;
}获取队头元素
// 获取队头元素
QUEDATATYPE QueueHead(Queue* pq)
{assert(pq);return pq-phead-data;
}判空
//判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq-size 0;
}获取栈中有效元素个数
// 获取栈中有效元素个数
int QueueSize(Queue* pq)
{assert(pq);return pq-size;
}销毁队列
//销毁队列
void QueueDestroy(Queue* pq)
{QUENODE* tmp pq-phead;while (tmp){pq-phead pq-phead-next;free(tmp);tmp pq-phead;}pq-phead pq-ptail NULL;pq-size 0;
}完整代码
Queue.h
#pragma once
#includestdio.h
#includestdlib.h
#includestdbool.h
#includeassert.htypedef int QUEDATATYPE;typedef struct QueueNode
{QUEDATATYPE data;struct QueueNode* next;
}QUENODE;typedef struct Queue
{QUENODE* phead;QUENODE* ptail;int size;
}Queue;//初始化队列
void QueueInit(Queue* pq);
//入队
void QueuePush(Queue* pq, QUEDATATYPE x);
//出队
void QueuePop(Queue* pq);
// 获取队头元素
QUEDATATYPE QueueHead(Queue* pq);
//判空
bool QueueEmpty(Queue* pq);
// 获取栈中有效元素个数
int QueueSize(Queue* pq);
//销毁队列
void QueueDestroy(Queue* pq);Queue.c
#includeQueue.h//初始化队列
void QueueInit(Queue* pq)
{assert(pq);pq-phead pq-ptail NULL;pq-size 0;
}//入队
void QueuePush(Queue* pq, QUEDATATYPE x)
{assert(pq);if (pq-phead NULL){QUENODE* Node (QUENODE*)malloc(sizeof(QUENODE));if (Node NULL){perror(malloc fail);exit(1);}Node-data x;Node-next NULL;pq-phead pq-ptail Node;}else{QUENODE* Node (QUENODE*)malloc(sizeof(QUENODE));if (Node NULL){perror(malloc fail);exit(1);}Node-data x;Node-next NULL;pq-ptail-next Node;pq-ptail Node;}pq-size;
}//出队
void QueuePop(Queue* pq)
{assert(pq pq-size 0);if (pq-phead-next NULL){free(pq-phead);pq-phead pq-ptail NULL;}else{QUENODE* tmp pq-phead;pq-phead pq-phead-next;free(tmp);tmp NULL;}pq-size--;
}// 获取队头元素
QUEDATATYPE QueueHead(Queue* pq)
{assert(pq);return pq-phead-data;
}//判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq-size 0;
}// 获取栈中有效元素个数
int QueueSize(Queue* pq)
{assert(pq);return pq-size;
}//销毁队列
void QueueDestroy(Queue* pq)
{QUENODE* tmp pq-phead;while (tmp){pq-phead pq-phead-next;free(tmp);tmp pq-phead;}pq-phead pq-ptail NULL;pq-size 0;
}结语
最后感谢您能阅读完此片文章如果有任何建议或纠正欢迎在评论区留言也可以前往我的主页看更多好文哦(点击此处跳转到主页)。 如果您认为这篇文章对您有所收获点一个小小的赞就是我创作的巨大动力谢谢