• 使用C语言实现队列


    目录

    1.队列

    2.队列的相关操作

    (1)数据结构定义

    (2)初始化和重新申请空间

    (3)判断队空,队满和获取队列中的元素个数

    (4)入队,出队和获取队头元素

    (5)主函数

    (6)测试


    1.队列

    栈:只允许在一端进行入栈和出栈操作的线性表;

    队列:允许在一端进行入队,另一端进行出队的线性表。

    以下只是顺序队列的形式:

    我们主要实现循环队列,因为循环队列的实现和顺序队列差不多,但是在判断队空和队满时需要注意。

     循环队列判断队空和队满有三种方法:

    (1)方法一:上面给出的(本文主要使用这一种)。

    (2)方法二:

     首先是另外设置一个标志位以区别队列是“空”还是“满”:比如:标志位 int tag=0(出队);tag(入队);

    1. if(tag==1&&q.rear==q.front){
    2. printf("队满");
    3. }
    4. if(tag==0&&q.rear==q.front){
    5. printf("队空");
    6. }

    (3)方法二:

    使用一个记录元素个数的变量:int size=0;

    注:最早进入队列的元素最早出队。其实在操作系统中的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业运行,如果运行的结果都需要通过通道输出,那么就要按请求输出的先后次序排队。每当通道传输完毕可以接收新的输出任务时,队头的作业先从队列中退出作业输出操作。比如还有我们在银行排队时也是队列的形式。 

    2.队列的相关操作

    (1)数据结构定义

    1. #include
    2. #include
    3. #define MAXSIZE 5
    4. typedef int ElemType;
    5. typedef struct Qeueu{
    6. ElemType *data;
    7. int rear,front;
    8. int Maxsize;
    9. }SqQueue;

    (2)初始化和重新申请空间

    1. //初始化
    2. void InitSqQueue(SqQueue&q){
    3. q.data=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
    4. if(q.data==NULL){
    5. printf("申请空间失败!\n");
    6. return;
    7. }
    8. q.front=0;
    9. q.rear=0;
    10. q.Maxsize=MAXSIZE;
    11. }
    12. //重新申请空间
    13. void reMalloc(SqQueue&q,int len){
    14. ElemType*newbase=(ElemType*)realloc(q.data,(q.Maxsize+len)*sizeof(ElemType));
    15. q.data=newbase;
    16. q.Maxsize=q.Maxsize+len;
    17. }
    18. void MenuSqQueue(){
    19. printf("--------------1.入队操作---------\n");
    20. printf("--------------2.出队操作---------\n");
    21. printf("--------------3.获取队头元素-----\n");
    22. printf("--------------4.重新初始化-------\n");
    23. printf("--------------5.退出操作---------\n");
    24. }

    (3)判断队空,队满和获取队列中的元素个数

    1. //判断队空
    2. bool Empty(SqQueue q){
    3. if(q.front==q.rear){
    4. return true;
    5. }else{
    6. return false;
    7. }
    8. }
    9. //判断队满
    10. bool Full(SqQueue q){
    11. if((q.rear+1)%q.Maxsize==q.front){
    12. return true;
    13. }else{
    14. return false;
    15. }
    16. }
    17. //队中元素
    18. int QueueLength(SqQueue q){
    19. int size=(q.rear-q.front+q.Maxsize)%q.Maxsize;
    20. return size;
    21. }

    (4)入队,出队和获取队头元素

    1. //入队
    2. void QueuePush(SqQueue&q,ElemType e){
    3. if(Full(q)){
    4. printf("队已满!\n");
    5. printf("请输入申请空间大小: ");
    6. int len=0;
    7. scanf("%d",&len);
    8. reMalloc(q,len);
    9. printf("当前空间大小: %d\n",q.Maxsize);
    10. return;
    11. }
    12. q.data[q.rear]=e;
    13. q.rear=(q.rear+1)%q.Maxsize;
    14. printf("插入元素成功!\n");
    15. }
    16. //出队
    17. void QueueDe(SqQueue&q,ElemType&e,int&mask){
    18. if(Empty(q)){
    19. printf("队已空!\n");
    20. mask=0;
    21. return;
    22. }
    23. e=q.data[q.front];
    24. q.front=(q.front+1)%q.Maxsize;
    25. }
    26. //获取队头元素
    27. void GetQueueHead(SqQueue q,ElemType&e,int&mask){
    28. if(Empty(q)){
    29. printf("队已空!\n");
    30. mask=0;
    31. return;
    32. }
    33. e=q.data[q.front];
    34. }

    (5)主函数

    1. int main(){
    2. SqQueue q;
    3. ElemType e;
    4. int flag=0;
    5. InitSqQueue(q);
    6. int mask=1;
    7. while(1){
    8. MenuSqQueue();
    9. printf("请输入操作: ");
    10. scanf("%d",&flag);
    11. switch(flag){
    12. case 1:
    13. printf("请输入元素(-1_end): ");
    14. scanf("%d",&e);
    15. while(e!=-1){
    16. QueuePush(q,e);
    17. printf("请输入元素(-1_end): ");
    18. scanf("%d",&e);
    19. }
    20. break;
    21. case 2:
    22. QueueDe(q,e,mask);
    23. if(mask!=0){
    24. printf("出栈元素 = %d\n",e);
    25. }
    26. break;
    27. case 3:
    28. GetQueueHead(q,e,mask);
    29. if(mask!=0){
    30. printf("获取元素 = %d\n",e);
    31. }
    32. break;
    33. case 4:
    34. InitSqQueue(q);
    35. printf("初始化成功!\n");
    36. break;
    37. default:
    38. free(q.data);
    39. printf("操作结束!\n");
    40. }
    41. if(flag==5){
    42. break;
    43. }
    44. }
    45. return 0;
    46. }

    (6)测试

     

     

  • 相关阅读:
    LVS-NAT模式部署
    SpringSecurity(七)【密码加密】
    Linux结构目录说明以及相关作用【重点】
    Linux四种I/O模型简单介绍下
    买美容仪看这篇,全网超火美容仪真实测评
    python 实现蚁群算法(simpy带绘图)
    State 和 Status 傻傻分不清
    【搜索】—— DFS之剪枝与优化
    Redis进阶
    stm32 获取解析并显示天气
  • 原文地址:https://blog.csdn.net/Keep_Trying_Go/article/details/126289222