• 队列的顺序存储与链式存储c语言实现


    一. 队列

    1.队列定义:只允许在表的一端进行插入,表的另一端进行删除操作的线性表。

     2.循环队列:把存储队列的顺序队列在逻辑上视为一个环。

     循环队列状态:

        初始时:Q.front=Q.rear=0

        front指针移动:Q.front=(Q.front+1)%MaxSize

        rear指针移动:Q.rear=(Q.rear+1)%MaxSize

        队列长度:(Q.rear+MaxSize-Q.front)%MaxSize

        队空条件:Q.front=Q.rear

        队满条件:Q.front=Q.rear

    3.区分队空和队满的三种处理

    1)牺牲一个存储单元来区分队空和队满

        队满条件:(Q.rear+1)%MaxSize=Q.front

        队空条件:Q.front=Q.rear

        队中元素个数:(Q.rear+MaxSize-Q.front)%MaxSize

    2)类型中增设表示元素个数的数据成员

        队空条件:Q.front=Q.rear && Q.size=0

        队满条件:Q.front=Q.rear && Q.size=MaxSize

    3)类型中增设tag数据成员,以区分队空还是队满

        tag=0时,若因删除导致Q.front=Q.rear,则为队空

        tag=1时,若因插入导致Q.front=Q.rear,则为队满

    二. 循环队列的顺序存储操作

    1.结构描述

    typedef struct Queue{
        ElemType data[MaxSize];
        int front,rear,size;
    }Queue;

    2.初始化队列

    Queue InitQueue()
     {
         Queue Q;
         Q.front=Q.rear=Q.size=0;
         return Q;
     }

    3.判断队列是否为空

    int Queue_Empty(Queue Q)
     {
         if(Q.front==Q.rear&&Q.size==0)
             return TRUE;
         else
             return FALSE;
     }

    4.判断队列是否为满

    int Queue_Full(Queue Q)
     {
         if(Q.front==Q.rear&&Q.size==MaxSize)
             return TRUE;
         else
             return FALSE;
     }

    5.入队

    int InQueue(Queue *q)
     {
         if(Queue_Full(*q))
             return FALSE;
         ElemType x;
         printf("输入入队元素:");
         scanf("%d",&x);
         q->data[q->rear]=x;
         q->rear=(q->rear+1)%MaxSize;
         q->size++;
         return TRUE;
     }

    6.出队

    int OutQueue(Queue *q,ElemType *x)
    {
        if(Queue_Empty(*q))
            return FALSE;
        *x=q->data[q->front];
        q->front=(q->front+1)%MaxSize;
        q->size--;
        return TRUE;
    }

    7.完整代码

    #include <stdio.h>
    #include <stdlib.h>
    #define TRUE 1
    #define FALSE 0
    #define MaxSize 10
    typedef int ElemType;
    typedef struct Queue{
        ElemType data[MaxSize];
        int front,rear,size;
    }Queue;
    
    Queue InitQueue();//初始化队列 
    int Queue_Empty(Queue Q);//判断队列是否为空 ,用size来判断空还是满 
    int Queue_Full(Queue Q);//判断队列是否满 
    int InQueue(Queue *q);//入队
    int OutQueue(Queue *q,ElemType *x);//出队,并记录出队元素 
    int main()
    {
        ElemType x;
        Queue Q=InitQueue();
        InQueue(&Q);
        InQueue(&Q);
        InQueue(&Q);
        InQueue(&Q);
        printf("此时队列长度:%d
    ",Q.size);
        return 0;
     } 
     
     Queue InitQueue()
     {
         Queue Q;
         Q.front=Q.rear=Q.size=0;
         return Q;
     }
     
     int Queue_Empty(Queue Q)
     {
         if(Q.front==Q.rear&&Q.size==0)
             return TRUE;
         else
             return FALSE;
     }
     
     int Queue_Full(Queue Q)
     {
         if(Q.front==Q.rear&&Q.size==MaxSize)
             return TRUE;
         else
             return FALSE;
     }
     
     int InQueue(Queue *q)
     {
         if(Queue_Full(*q))
             return FALSE;
         ElemType x;
         printf("输入入队元素:");
         scanf("%d",&x);
         q->data[q->rear]=x;
         q->rear=(q->rear+1)%MaxSize;
         q->size++;
         return TRUE;
     }
     
    int OutQueue(Queue *q,ElemType *x)
    {
        if(Queue_Empty(*q))
            return FALSE;
        *x=q->data[q->front];
        q->front=(q->front+1)%MaxSize;
        q->size--;
        return TRUE;
    }
    View Code

    运行示例:

     三. 队列的链式存储

    链队列:同时带有队头指针和队尾指针的单链表。

    1.结构描述

    typedef struct Node{
        ElemType data;
        struct Node *next;
    }Node;
    
    typedef struct Queue{
        struct Node *front,*rear;
    }Queue;

    2.链队列初始化

    Queue InitQueue()
    {
        Queue Q;
        Q.front=Q.rear=(Node*)malloc(sizeof(Node));
        Q.front->next=NULL;
        return Q;    
    }

    3.判断队列是否为空

    int Queue_Empty(Queue Q)
    {
        if(Q.front==Q.rear)
            return TRUE;
        else
            return FALSE;
    }

    4.入队

    void InQueue(Queue *q)
    {
        ElemType x;
        printf("输入入队元素:");
        scanf("%d",&x);
        Node *p=(Node*)malloc(sizeof(Node));
        p->data=x;
        p->next=NULL;
        q->rear->next=p;
        q->rear=p;
    }

    5.出队

    int OutQueue(Queue *q,ElemType *x)
    {
        if(Queue_Empty(*q))
        {
            return FALSE;
        }
        Node *p=q->front->next;
        *x=p->data;
        q->front->next=p->next;
        if(q->rear==p)
        {
            q->rear=q->front;
        }
        free(p);
        return TRUE;
    }

    6.完整代码

    #include <stdio.h>
    #include <stdlib.h>
    #define TRUE 1
    #define FALSE 0
    typedef int ElemType;
    typedef struct Node{
        ElemType data;
        struct Node *next;
    }Node;
    
    typedef struct Queue{
        struct Node *front,*rear;
    }Queue;
    
    Queue InitQueue();//链队列初始化
    int Queue_Empty(Queue Q);//判断队列是否为空 
    void InQueue(Queue *q);//入队 
    int OutQueue(Queue *q,ElemType *x);//出队 
    
    int main()
    {
        ElemType x;
        Queue Q=InitQueue();
        InQueue(&Q);
        InQueue(&Q);
        InQueue(&Q);
        OutQueue(&Q,&x);
        printf("出队元素:%d
    ",x);
        return 0;
    }
    
    Queue InitQueue()
    {
        Queue Q;
        Q.front=Q.rear=(Node*)malloc(sizeof(Node));
        Q.front->next=NULL;
        return Q;    
    }
    
    int Queue_Empty(Queue Q)
    {
        if(Q.front==Q.rear)
            return TRUE;
        else
            return FALSE;
    }
    
    void InQueue(Queue *q)
    {
        ElemType x;
        printf("输入入队元素:");
        scanf("%d",&x);
        Node *p=(Node*)malloc(sizeof(Node));
        p->data=x;
        p->next=NULL;
        q->rear->next=p;
        q->rear=p;
    }
    
    int OutQueue(Queue *q,ElemType *x)
    {
        if(Queue_Empty(*q))
        {
            return FALSE;
        }
        Node *p=q->front->next;
        *x=p->data;
        q->front->next=p->next;
        if(q->rear==p)
        {
            q->rear=q->front;
        }
        free(p);
        return TRUE;
    }
    View Code

    运行示例:

  • 相关阅读:
    Web框架下安全漏洞的测试反思
    如何能低成本地快速获取大量目标用户,而不是与竞争对手持久战?
    Spring-Boot自定义Starter实践
    WM_QUERYENDSESSION与WM_ENDSESSION
    AutoMapper用法
    使用AutoMapper实现Dto和Model的自由转换(下)
    使用AutoMapper实现Dto和Model的自由转换(中)
    使用AutoMapper实现Dto和Model的自由转换(上)
    JSON中JObject和JArray的修改
    通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。
  • 原文地址:https://www.cnblogs.com/hky8220/p/13216825.html
Copyright © 2020-2023  润新知