zoukankan      html  css  js  c++  java
  • 队列表示与实现

      队列是一种先进先出(FIFO)的线性表,他只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为对头(front)。

    链队列——队列的链式表示和实现

      用链表表示的队列简称链队列。一个链队列显然需要两个分别指示对头和队尾的指针才能唯一确定。空的链队列的判决条件为头指针和尾指针均指向头结点。链队列的操作即为单链表的插入和删除操作的特殊情况,只是尚需修改尾指针或头指针。

    typedef struct QNode
    {
        int data;
        struct QNode *next;
    }QNode,*QueuePtr;
    typedef struct
    {
        QueuePtr front;
        QueuePtr rear;
    }LinkQueue;
    //队列初始化
    void QueueInit(LinkQueue &Q)
    {
        Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
        if(!Q.front)
            exit(0);
        Q.front->next=NULL;
    }
    void Destroy(LinkQueue &Q)
    {
        while(Q.front)
        {
            Q.rear=Q.front->next;
            free(Q.front);
            Q.front=Q.rear;
        }
    }
    //判断队列是否为空:为空返回1,不为空返回0
    int IsEmpty(LinkQueue Q)
    {
        if(Q.front==Q.rear)
            return 1;
        return 0;
    }
    //返回队列的头元素
    int GetHear(LinkQueue Q,int &e)
    {
        if(Q.front==Q.rear)
        {
            cout << "The queue is empty!" << endl;
            exit(1);
        }
        return Q.front->data;
    }
    //入队
    void EnQueue(LinkQueue &Q,int e)
    {
        QNode *p=(QueuePtr)malloc(sizeof(QNode));
        if(!p)
            exit(0);
        p->data=e;
        p->next=NULL;
        Q.rear->next=p;
        Q.rear=p;
    }
    //出队
    void Dequeue(LinkQueue &Q,int &e)
    {
        if(Q.front==Q.rear)
            exit(0);
        QNode *p;
        p=Q.front->next;
        e=p->data;
        Q.front->next=p->next;
        if(Q.rear==p)
            Q.rear=Q.front;
        free(p);
    }

    循环队列——队列的顺序表示和实现

      初始化队列时,令front=rear=0,每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。因此,在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置。当什么时候队列满呢?当rear等于front的时候。可是队列为空的时候也是同样的条件,那不就没法判断了吗?又有人提出了这样的想法:牺牲一个存储空间,front前面不存数据,当rear在front前面的时候就是满了。

      

      满的判断条件应为:(rear+1)%LENGTH == front 。空的判断条件为 rear == front。

     

    #define MAXSIZE 100
    typedef struct
    {
        int *base;
        int front;
        int rear;
    }SqQueue;
    void InitQueue(SqQueue &Q)
    {
        Q.base=(int *)malloc(MAXSIZE*sizeof(int));
        if(!Q.base)
            exit(0);
        Q.front=Q.rear=0;
    }
    int QueueLength(SqQueue Q)
    {
        return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
    }
    void EnQueue(SqQueue &Q,int e)
    {
        if((Q.rear+1)%MAXSIZE==Q.front)
            exit(0);
        Q.base[Q.rear]=e;
        Q.rear=(Q.rear+1)%MAXSIZE;
    }
    void DeQueue(SqQueue &Q,int &e)
    {
        if(Q.rear==Q.front)
            exit(0);
        e=Q.base[Q.front];
        Q.front=(Q.front+1)%MAXSIZE;
    }

     

     

  • 相关阅读:
    storm学习之入门篇(一)
    大数据基础知识:分布式计算、服务器集群[zz]
    weblogic 12c 配置jvm的内存大小
    JamCam创业故事:辞掉工作,去开发一个应用
    数据挖掘-关联规则分析[ZZ]
    十道海量数据处理面试题与十个方法大总结(转载)
    设计模式简单说明
    jQuery 设置select,radio的值,无法自动触发绑定的change事件
    切换node版本,node-sass安装报错
    jQuery之编写插件
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3699342.html
Copyright © 2011-2022 走看看