队列的基础知识

一、队列的定义与特点

     队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构。与栈结构不同的是,队列的两端都“开口”,要求数据只能从一端进,从另一端出。

  逻辑结构            与线性表相同,仍为一对一关系
  存储结构            用顺序队列或链队列存储即可
访问结点时依照先进先出(FIFO)或后进后出(LILO)的原则

队列的抽象数据类型
ADT Queue {
          数据对象:D={ai| ai∈ElemSet, i=1,2,...,n, n≥0 }
          数据关系:R1={ | ,ai-1,ai∈D, i=2,...,n } 约定an端为队列尾,a1端为队列头。
         基本操作:
                         (1) InitQueue (&Q)                      //构造空队列
                         (2) DestroyQueue (&Q)              //销毁队列
                         (3) ClearQueue (&S)                  //清空队列
                         (4) QueueEmpty(S)                   //判空. 空--TRUE
                         (5) QueueLength(Q)                 //取队列长度
                         (6) GetHead (Q,&e)                 //取队头元素,
                         (7) EnQueue (&Q,e)                //入队列
                         (8) DeQueue (&Q,&e)             //出队列
} ADT Queue

二、顺序队列

队列的顺序表示--用一维数组base[Maxsize]
       #define Maxsize 100 //最大队列长度
       Typedef struct {
            QElemType *base;            //初始化的动态分配存储空间,或者QElemType base[Maxsize]
            int front;                            //头指针
            int rear;                            //尾指针
       }SqQueue;

空队标志:front= =rear
入队:base[rear++]=x;
出队:x=base[front++]

三、循环队列

  队空:front==rear             队满:front==rear

队列的循环表示
        #define MAXQSIZE 100 //最大长度
        Typedef struct {
            QElemType *base;            //初始化的动态分配存储空间或者QElemType base[MAXQSIZE]
            int front;                            //头指针
            int rear;                            //尾指针
        }SqQueue;

循环队列初始化
        Status InitQueue (SqQueue &Q){
             Q.base =new QElemType[MAXQSIZE];
             if(!Q.base) exit(OVERFLOW);
             Q.front=Q.rear=0;
             return OK;
        }

求循环队列的长度
       int QueueLength (SqQueue Q){
              return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
       }
循环队列入队
        Status EnQueue(SqQueue &Q,QElemType e){
               if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;
               Q.base[Q.rear]=e;
               Q.rear=(Q.rear+1)%MAXQSIZE;
                return OK;
        }
循环队列出队
        Status DeQueue (LinkQueue &Q,QElemType &e){
                  if(Q.front==Q.rear) return ERROR;
                  e=Q.base[Q.front];
                  Q.front=(Q.front+1)%MAXQSIZE;
                  return OK;
      }

四、链队列

  若无法估计所用队列的长度,则采用链队列
     typedef struct QNode{
            QElemType data;
            struct Qnode *next;
     }Qnode, *QueuePtr;
     typedef struct {
            QueuePtr front;             //队头指针
            QueuePtr rear;              //队尾指针
     }LinkQueue;

链队列初始化
    Status InitQueue (LinkQueue &Q){
          Q.front=Q.rear=(QueuePtr) malloc(sizeof(QNode));
          if(!Q.front) exit(OVERFLOW);
          Q.front->next=NULL;
          return OK;
   }

判断链队列是否为空

   Status QueueEmpty (LinkQueue Q){
         return (Q.front==Q.rear);
   }

销毁链队列---从队头结点开始,依次释放所有结点
       Status DestroyQueue (LinkQueue &Q){
             while(Q.front){
             Q.rear=Q.front->next;
             free(Q.front);
             Q.front=Q.rear;
             }
            return OK;
       }

求链队列的队头元素
     Status GetHead (LinkQueue Q, QElemType &e){
             if(Q.front==Q.rear) return ERROR;
             e=Q.front->next->data;
             return OK;
    }

链队列入队
   Status EnQueue(LinkQueue &Q,QElemType e){
            p=(QueuePtr)malloc(sizeof(QNode));
            if(!p) exit(OVERFLOW);
            p->data=e; p->next=NULL;
           Q.rear->next=p;
           Q.rear=p;
           return OK;
  }

链队列出队
  Status DeQueue (LinkQueue &Q,QElemType &e){
           if(Q.front==Q.rear) return ERROR;
           p=Q.front->next;
           e=p->data;
          Q.front->next=p->next;
          if(Q.rear==p) Q.rear=Q.front;
          delete p;
          return OK;
}

你可能感兴趣的:(java,开发语言)