• 队列的链式存储和顺序存储


    1、队列的链式存储:

    思路:

    (1)建立两个结构体,一存储数据及下一个节点的信息,另一个存储链表的表头和表尾指针。

    (2)出队列时一定要注意如果只剩下最后一个节点,要提前让Q->Top=Q->Rear,因为如果tp被删除后,就不能再去调用它的next,

    最后就找不到结果了。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    struct Node{
        int x;
        struct Node* next;
    };
    
    struct N{
        struct Node* Top;
        struct Node* Rear;
    };
    typedef struct N* Queue;
    
    int IsEmpty(Queue Q)
    {
        return Q->Top==Q->Rear; 
    }
    
    Queue CreateQueue()
    {
        Queue Q=(Queue)malloc(sizeof(struct N));
        if(Q==NULL) printf("Out of Space!!!");
        
        Q->Rear=(Node*)malloc(sizeof(struct Node));
        if(Q->Rear==NULL) printf("Out of Space!!!");
        Q->Rear->next=NULL;
        
        Q->Top=(Node*)malloc(sizeof(struct Node));
        if(Q->Top==NULL) printf("Out of Space!!!");
        Q->Top->next=NULL;
        
        Q->Top=Q->Rear;
        return Q;
    }
    
    void EnQueue(int x,Queue Q)
    {
        struct Node* tp=(Node*)malloc(sizeof(struct Node));
        tp->x=x;
        tp->next=Q->Rear->next;
        Q->Rear->next=tp;
        Q->Rear=Q->Rear->next;
    }
    
    int DeQueue(Queue Q)
    {
        if(!IsEmpty(Q))
        {
            int x;
            struct Node* tp=Q->Top->next;
            x=tp->x;
            Q->Top->next=tp->next;
            if(Q->Rear==tp) Q->Rear=Q->Top; //重点,没有就不能结束。 
            free(tp);
            return x;
        }
    }
    
    int main(void)
    {
        Queue Q=CreateQueue();
        int n,x,i;
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&x);
            EnQueue(x,Q);
        }
        while(!IsEmpty(Q))
        {
            printf("%d ",DeQueue(Q));
        }
        printf("
    ");
        return 0;
    }
    View Code

    2、队列的顺序存储

    思路:

     建立队列的结构体,每个结构体中有top头指针,rear尾指针,size队列的现在的大小,capcity队列的最大容量。

    然后初始化top=1,rear=0,每次插入rear++,就表示插入新节点,top++表示出队列,这里要对rear,top进行取余或者判断操作,

    让它们在数组的范围内变化(就是循环数组)。

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    const int maxn = 1200;
    
    struct Node{
        int capcity;
        int top;
        int rear;
        int size;
        int *array;
    };
    
    typedef struct Node* Queue;
    
    int IsEmpty(Queue Q)
    {
        return Q->size==0;
    }
    
    int IsFull(Queue Q)
    {
        return Q->size==Q->capcity;
    }
    
    void MakeEmpty(Queue Q)
    {
        Q->top=1;
        Q->rear=0;
    }
    
    int Succ(int x,Queue Q)
    {
        if(++x==Q->capcity) x=0;
        return x;
    }
    
    void EnQueue(int x,Queue Q)
    {
        if(IsFull(Q))
        {
            printf("Full Queue");
        }
        else
        {
            Q->size++;
            Q->rear=Succ(Q->rear,Q);
            Q->array[Q->rear]=x;
        }
    }
    
    int DeQueue(Queue Q)
    {
        if(!IsEmpty(Q))
        {
            Q->size--;
            int x=Q->array[Q->top];
            Q->top++;
            if(Q->top==Q->capcity) Q->top=0;
            return x;
        }
    }
    
    Queue CreateQueue(int maxsize)
    {
        Queue Q=(Queue)malloc(sizeof(struct Node));
        if(maxsize>maxn) printf("too small");
        Q->capcity=maxsize;
        Q->size=0;
        Q->array=(int*)malloc(sizeof(int)*maxsize);
        MakeEmpty(Q);
        return Q;
    }
    
    int main(void)
    {
        int n,i,x;
        scanf("%d",&n);
        Queue Q=CreateQueue(n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&x);
            EnQueue(x,Q);
        }
        while(!IsEmpty(Q))
        {
            printf("%d ",DeQueue(Q));
        }
        printf("
    ");
        return 0;
    }
    View Code
  • 相关阅读:
    ASP.NET通用权限管理系统(FrameWork) 1.0.0 Release 发布
    ASP.NET通用权限管理系统(FrameWork) 1.0.3 Release
    ASP.NET通用权限管理系统(FrameWork) 之用户在线列表 泛型缓存 [原创]
    DDBuildToolsRelease1.0
    FineMessBox弹出窗口js (修改版,增加对Firefox支持)
    [开源]ASP.NET通用权限管理系统(FrameWork) 1.0.2 Release
    [开源]ASP.NET通用权限管理系统(FrameWork) 1.0.1 Release
    如何在CodePlex 创建开源项目
    今天上班遇到好人了
    ASP.NET通用权限管理系统(FrameWork) 在线演示地址
  • 原文地址:https://www.cnblogs.com/2018zxy/p/10035432.html
Copyright © 2020-2023  润新知