文章目录

  • 1.队列的简介
  • 2.队列的简单实现
  • 3.循环队列说明
  • 4.循环队列实现

1.队列的简介

队列(Queue),简称队,它也是一种运算受限的特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO)线性表。
对应我们日常生活中的情形,比如,在食堂的单窗口买饭,一个食堂阿姨每次只能给一位同学打饭,那么我们就需要排队买饭,先到的同学排在队伍的前面,后来的同学排在后面。前面的同学先买到饭然后出队离开;后面来的同学原则上只能排到队伍的后面(手动狗头)。这就是先来的先请求得到服务。再比如我们有一台网络共享打印机,网络中的任何一台机器都可以向它发出打印请求。但它每次只能服务一个,该如何处理这些请求呢?这个时候控制打印机的程序就会把请求们加入到一个队列,只要队列中有内容,打印机就会从不断地从队列头部取出请求执行打印。计算机的处理器也是一个共享的资源,很多程序或者说进程需要处理器的时间片来执行,那么这些进程也会被放入一个队列。

对于栈,插入和删除只能从一端进行;对于队列,插入和删除操作必须从不同端进行。接下来我们用两种方式来实现相关操作。

2.队列的简单实现

首先创建一个包含整型元素的数组来存储队列。下面是一种极其简单的实现方式。代码:

#include<stdio.h>
#define MAXSIZE 10
int A[MAXSIZE];//定义一个全局整型数组存放队元素
int front = -1;
int rear = -1; //队空时将索引置为-1;
//入队操作void Enqueue(int x){//队满则不支持入队if(rear ==MAXSIZE-1){printf("Error:Queue is Full ");return ;}A[++rear] = x;}//出队操作void Dequeue(){if((rear ==-1)&& front ==-1){printf("Error:Queue is Empty");return ;}else if(rear == front&&(rear!=-1)){//队列只有一个元素 rear = -1;front = -1;}else{front  = front+1;}    } // 返回队尾值int Rear(){return A[rear];} void Print(){int i;printf("queue:  ");for(i=front+1;i<=rear;i++){printf("%d  ",A[i]);}printf("\n");}int main(){Enqueue(1);Enqueue(2);Enqueue(3);Print();Dequeue();Dequeue();printf("now the queue is: ");Print();}

运行结果:

3.循环队列说明

很明显,以上的方法,我们只是利用简单的数组进行了模拟。它存在着很多的不足。比如,当我们删去队列中的元素时,我们没法使用他们留下来的空位,每一次Dequeue空下来的front位都会被闲置。这样对空间造成了很大的浪费。于是,我们设计循环数组。通过取余的操作,使front和rear指针发生改变。除此之外,我们说队列也是一种线性表,对于线性表,我们使用结构体来定义才是一种更加理想的方式。

4.循环队列实现

结构体定义:

typedef struct
{QElemType *base;//初始化动态分配的指定长度的空间int front;//头指针,若队列不空,指向队列头元素int rear;//尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;

循环队列初始化:

bool InitQueue(SqQueue *Q)
{Q->base=(QElemType*)malloc(maxQueueSize*sizeof(QElemType));if (!Q->base){return false;}Q->front=0;Q->rear=0;return true;
}

入队函数:

bool EnQueue(SqQueue *Q,QElemType e)
{if ((Q->rear+1)%maxQueueSize==Q->front)//队列满{return false;}Q->base[Q->rear]=e;Q->rear=(Q->rear+1)%maxQueueSize;printf("%d successfully in\n",e);return true;
}

出队函数:

bool DeQueue(SqQueue *Q,QElemType *e)
{if (Q->front==Q->rear)//队列空{return false;}*e=Q->base[Q->front];Q->front=(Q->front+1)%maxQueueSize;printf("%d successfully out!\n",*e);return true;
}

打印函数和主函数:

void printfQueue(SqQueue Q)
{printf("Now the queue is:\n");while (Q.front!=Q.rear){if (Q.front==maxQueueSize &&(Q.rear+1)%maxQueueSize!=Q.front){Q.front=0;}printf("%d ",Q.base[Q.front]);Q.front++;}printf("\n");
}int main()
{SqQueue *Q=(SqQueue*)malloc(sizeof(SqQueue));InitQueue(Q);EnQueue(Q,1);EnQueue(Q,3);EnQueue(Q,1);EnQueue(Q,4);printfQueue(*Q);QElemType *e=(QElemType*)malloc(sizeof(QElemType));DeQueue(Q,e);DeQueue(Q,e);EnQueue(Q,9);EnQueue(Q,9);printfQueue(*Q);return 0;
}

执行结果:

C语言队列的基本实现相关推荐

  1. c语言队列如何表示,队列的链式表示和实现(C语言)

    #include #include #define OK 1; #define ERROR 0; #define OVERFLOW 0; #define TURE 1; #define FALSE 0 ...

  2. c语言 队列 游戏,循环队列实现约瑟夫游戏(C语言版)

    #include #include typedef struct node { int *base; int front; int rear; }Node; /* 思路: *使用一个顺序循环队列来存放 ...

  3. c语言队列渡船问题,渡船有关问题

    当前位置:我的异常网» C语言 » 渡船有关问题 渡船有关问题 www.myexceptions.net  网友分享于:2013-03-06  浏览:22次 渡船问题! 一渡口,每条渡轮一次能装载6辆 ...

  4. c语言里有队列函数没,C语言队列的实现 - osc_tf30cc36的个人空间 - OSCHINA - 中文开源技术交流社区...

    对于C语言的队列来说,也有顺序存储和链表存储两种方式. 顺序存储容量固定,链表存储随时分配释放更加灵活. 下面是链表实现的队列初始化.入队.出队函数实现: #include #include #inc ...

  5. c语言队列实现FIFO

    //队列的链表式实现 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include &l ...

  6. vc c语言队列库函数的调用,C语言获取SYSTEMTIME

    C语言中如何获取时间?精度如何? 1 使用time_t time( time_t * timer ) 精确到秒 2 使用clock_t clock() 得到的是CPU时间精确到1/CLOCKS_PER ...

  7. 优先级队列 c语言,队列优先级

    优先级队列比队列更专业的数据结构.像普通队列,优先级队列中有相同的方法,但在使用上是有比较大的区别的.在优先级队列数据项都受到键值排序,以便与最低键的值,数据项在前方,键的最高值的数据项在后方,反之亦 ...

  8. c语言队列(顺序队列,循环队列,链式队列)

    顺序队列 1.初始化: front=-1; rear=-1; 2.判空条件 font=rear; 3.队列已满条件 rear=max-1; 代码: #include<stdio.h> #i ...

  9. c语言队列原理的实现,c印记(十二):队列queue原理与实现

    一.简而言之 在百度百科里面摘取了一段关于队列(queue)的介绍: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样, ...

  10. c语言队列作用,队列(C语言)

    一.定义 一种可以实现"先进先出"的存储结构. 二.分类 1.链式队列:用链表实现. 2.静态队列:用数组实现. 静态队列通常都必须是循环队列. 3.循环队列 (1)循环队列需要几 ...

最新文章

  1. 移动磁盘由于IO设备错误,要怎样寻回文件
  2. 【题解】P1419 寻找段落(二分+单调队列)难度⭐⭐⭐★
  3. 七夕节脱单“神助攻”!AI教你写情话
  4. 修改Static控件的字体颜色
  5. 驱动级的自动按键_茶陵定做自动伸缩门定制,防火门厂家直销-湖南富扬门窗
  6. String String.valueof() toString三者之间的区别~
  7. 数据3分钟丨CSDN 1024程序员节来啦!PostgreSQL 14和openGauss 2.1.0在同一天正式发布。...
  8. Python面向对象编程 self的含义
  9. linux 内核 ide,Linux设备驱动程序学习(7)-内核的数据类型
  10. 一个函数解决【LeetCode 买卖股票的最佳时机】系列所有题目!
  11. SQL Server内存
  12. Aps.Net js ymPrompt消息提示组件4.0版
  13. Java的API帮助文档
  14. java 根据银行卡号来获取银行名称
  15. 阿帕奇服务器文件上传,windows基于阿帕奇+PHP服务器,实现vc++文件上传功能
  16. 自走棋服务器没有响应,从爆火到凉凉,多多自走棋宣布停服,加入腾讯属于无奈?...
  17. 利润统计函数c语言,C语言计算内部回报率(或名内部收益率)(IRR)
  18. 品读 泰戈尔 飞鸟集 之六 伤往昔
  19. flutter 设置全屏背景图(导航栏)
  20. 个人申请微信公众号步骤(含截图)

热门文章

  1. Map集合的遍历方式(3种)
  2. python2.0安装教程_Python2.7 【安装教程】
  3. 深圳数据分析认证(CPDA)含金量怎么样?
  4. 【python】我用python抓取了19个一线城市三年的房价数据,并做了走势分析
  5. htmlCSS面试题
  6. VOIP语音电话配置
  7. The surface has been released错误原因(亲测有效)
  8. 2022年最新西藏机动车签字授权人模拟考试及答案
  9. linux抓包UDP流量
  10. 【Unity3D】动态更换天空盒(场景不受天空盒影响 等问题)