顺序队列的基本操作(入队出队遍历)及C/C++代码实现
创作时间:
作者:
@小白创作中心
顺序队列的基本操作(入队出队遍历)及C/C++代码实现
引用
1
来源
1.
https://www.dotcpp.com/course/106
顺序队列是一种常见的数据结构,其基本操作包括入队、出队和遍历。本文将详细介绍这些操作的原理和C/C++代码实现。
1. 入队操作
在进行入队(push)操作时,首先需要判断队列是否为空。如果队列为空,需要将头指针和尾指针一同指向第一个结点;如果队列不为空,则只需要将尾结点向后移动。
代码实现如下:
//入队操作
void push(queue *q, int data){
node *n = init_node();
n->data = data;
n->next = NULL; //采用尾插入法
if (empty(q)){
q->front = n;
q->rear = n;
} else {
q->rear->next = n; //n成为当前尾结点的下一结点
q->rear = n; //让尾指针指向n
}
}
2. 出队操作
出队(pop)操作需要在队列不为空的情况下进行。如果队列只有一个元素,需要将头尾指针制空并释放该结点;如果队列含有两个以上元素,则将队列的头指针指向下一个元素并释放当前元素。
代码实现如下:
//出队操作
void pop(queue *q){
node *n = q->front;
if (empty(q)){
return; //此时队列为空,直接返回函数结束
}
if (q->front == q->rear){
q->front = NULL; //只有一个元素时直接将两端指向制空即可
q->rear = NULL;
free(n); //记得归还内存空间
} else {
q->front = q->front->next;
free(n);
}
}
3. 打印队列元素(遍历)
遍历队列元素需要在队列不为空的情况下,通过结点的next指针依次遍历并输出元素。
代码实现如下:
//打印队列元素
void print_queue(queue *q){
node *n = init_node();
n = q->front;
if (empty(q)){
return; //此时队列为空,直接返回函数结束
}
while (n != NULL){
printf("%d\t", n->data);
n = n->next;
}
printf("\n"); //记得换行
}
此外,遍历操作还可以用于计算队列中元素的数量:
int calac(queue *q){
node *n = init_node();
n = q->front;
int cnt = 0; //计数器设计
if (empty(q)){
return 0; //此时队列为空,直接返回函数结束
}
while (n != NULL){
n = n->next;
cnt++;
}
return cnt;
}
4. 代码实现
完整的代码实现如下:
#include <stdio.h>
#include <stdlib.h>
//结点定义
typedef struct node{
int data;
struct node *next;
}node;
//队列定义,队首指针和队尾指针
typedef struct queue{
node *front;
node *rear;
}queue;
//初始化结点
node *init_node(){
node *n = (node*)malloc(sizeof(node));
if (n == NULL){ //建立失败,退出
exit(0);
}
return n;
}
//初始化队列
queue *init_queue(){
queue *q = (queue*)malloc(sizeof(queue));
if (q == NULL){ //建立失败,退出
exit(0);
}
//头尾结点均赋值NULL
q->front = NULL;
q->rear = NULL;
return q;
}
//队列判空
int empty(queue *q){
if (q->front == NULL){
return 1; //1--表示真,说明队列非空
} else {
return 0; //0--表示假,说明队列为空
}
}
//入队操作
void push(queue *q, int data){
node *n = init_node();
n->data = data;
n->next = NULL; //采用尾插入法
if (empty(q)){
q->front = n;
q->rear = n;
} else {
q->rear->next = n; //n成为当前尾结点的下一结点
q->rear = n; //让尾指针指向n
}
}
//出队操作
void pop(queue *q){
node *n = q->front;
if (empty(q)){
return; //此时队列为空,直接返回函数结束
}
if (q->front == q->rear){
q->front = NULL; //只有一个元素时直接将两端指向制空即可
q->rear = NULL;
free(n); //记得归还内存空间
} else {
q->front = q->front->next;
free(n);
}
}
//打印队列元素
void print_queue(queue *q){
node *n = init_node();
n = q->front;
if (empty(q)){
return; //此时队列为空,直接返回函数结束
}
while (n != NULL){
printf("%d\t", n->data);
n = n->next;
}
printf("\n"); //记得换行
}
//主函数调用,这里只是简单介绍用法
int main(){
queue *q = init_queue();
/////////////入队操作/////////////////
printf("入队\n");
for (int i = 1; i <= 5; i++){
push(q, i);
print_queue(q);
}
/////////////出队操作/////////////////
printf("出队\n");
for (int i = 1; i <= 5; i++){
pop(q);
print_queue(q);
}
return 0;
}
5. 配套题目推荐
对于基本的操作,可以同链表的题目测试,自定义一些数据集来测试。此外,队列的操作在很多算法设计中都会使用到,尤其是BFS(广度优先搜索)算法的设计和一些图论的算法设计几乎无法离开各种类型的队列的灵活使用。
对于本样例代码,建议将队列元素数量设计入结构体中,这样每次询问队列中含有多少元素时就不必再进行遍历。
热门推荐
玻璃酸钠滴眼液:缓解眼干的正确使用方法和副作用详解
心血管疾病有哪些症状
玻璃酸钠滴眼液使用指南:一日5-6次,12项禁忌需谨记
在家怎么测心率最准?5种方法详解
北航团队研发世界最强MXene纳米复合薄膜,创新液态金属交联技术
燃爆全场!这场运动会广播稿太精彩了
长江江豚数量首现增长,科研保护迎来突破性进展
活性氢氧化铝:工业新材料的多功能应用与未来展望
既能杀菌又能培养细胞,新型纳米材料将变革再生医学
冬季蜂蜜结晶的秘密:荔枝蜜篇
百年蜂巢教你搞定蜂蜜结晶
百花蜜结晶是变质了吗?营养价值与选购指南
蜂蜜结晶就是变质了吗?
养老金充足度直接影响老年健康,我国替代率仅37%
个人养老金制度全面实施,退休生活品质提升有新招
高薪VS轻松:养老金计算帮你做出职业选择
养老金计算全攻略:三部分组成与估算方法详解
2025国考分数线预测:中央机关或达110分,西部地区95分
破解企业团队管理六大难题,构建高效协作体系
广东人的“牛一”生日祝福:一个独特的文化传统
“豫牛一号”:科技赋能传统农业,引领肉牛育种新革命
阿根廷绿檀手串:盘玩养生两不误,从选购到养护全攻略
买车修车提防隐形消费,4S店这些套路要当心
玻璃酸钠滴眼液长期使用安全,但需遵医嘱
血浆渗透压应维持在280~310mOsm/kg·H₂O,通过合理饮水、均衡饮食和定期体检可保持稳定。
从补液到肾透析:高渗透压治疗方案全解析
盐摄入与高血压:4类食物助力稳定血压,夏秋交际需警惕
GLIBCXX_3.4.30版本问题?只需几步轻松解决!
全球首例!天鹅洲保护区成功实现江豚野化放归
GCC编译器升级引发的GLIBCXX_3.4.30兼容性问题解析