數據結構再學習--隊列

隊列遵循着先入先出的原則,由一個線性表和兩個保存頭尾索引的變量組成,爲了節省空間和提高效率,可以把隊列做成循環隊列。使得移除的數據留下的空間可以循環利用,而僅僅失去一個位置用來處理判斷隊列是否爲滿。

下面是隊列和循環隊列的實現


// 普通的隊列

void initXBQueue(XBQueue*q)//初始化隊列
{
    q->front=-1;
    q->rear=-1;
}
int isXBQueueEmpty(XBQueue*q)//判斷隊列是否空
{
    if(q->front==q->rear)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}
int isXBQueueFull(XBQueue*q)//判斷是否滿了
{
    if(q->rear==MAX_SIZE-1)
    {
        printf("隊列已經滿了,不能進入隊列操作\n");
        return 1;
    }
    else
    {
        return 0;
    }
    
}
int getXBQueueLength(XBQueue q)//獲取長度
{
    return (q.rear-q.front);
}
int insertXBQueue(XBQueue*q,DATATYPE m)//插入元素
{
    if(isXBQueueFull(q))
        return 0;
    q->rear=q->rear+1;
    q->qm[q->rear]=m;
    return 1;
}
int delXBQueueItem(XBQueue*q,DATATYPE *e)
{
    if(isXBQueueEmpty(q))return 0;
    q->front=q->front+1;
    *e=q->qm[q->front];
    return 1;
}
void printXBQueue(XBQueue q)
{
    int i;
    printf("隊列的元素是:\n");
    for(i=q.front+1;i<=q.rear;i++)
    {
        printf("%d",q.qm[i]);
    }
    printf("\n");
}

// -----循環隊列


// 循環隊列初始化的時候可以設置,頭指針和尾指針可以設置爲0,不能設置爲-1,否則循環部分計算複雜.
void initXBLoopQueue(XBLoopQueue*q)//初始化隊列
{
    q->front=0;
    q->rear=0;
}
//相等的條件判斷沒有變化
int isXBLoopQueueEmpty(XBLoopQueue*q)//判斷隊列是否空
{
    if(q->front==q->rear)
    {
        return YES;
    }
    else
    {
        return NO;
    }
}
int isXBLoopQueueFull(XBLoopQueue*q)//判斷是否滿了
{
    if (q->front==0&&q->rear==M-1) {//這是一直插入但是沒有取出的情況,所以最後一個位置無法存儲元素。。
        return YES;
    }
    if (q->rear%M==q->front-1) { //這是出現了循環
        return YES;
    }
    return NO;

}
int getXBLoopQueueLength(XBLoopQueue q)//獲取長度
{
    if (q.front<q.rear%M) {
        return q.rear - q.front;
    }
    else
    {
      return  M-q.front+q.rear;//這裏處理循環的情景
    }
}
int insertXBLoopQueue(XBLoopQueue*q,DATATYPE m)//插入元素
{
    if(isXBLoopQueueFull(q)){
        return NO;
    }
    q->qm[q->rear]=m;
    q->rear=(q->rear+1)%M;
    return YES;
}
int delXBLoopQueueItem(XBLoopQueue*q,DATATYPE *e)
{
    if(isXBLoopQueueEmpty(q))return NO;
    *e=q->qm[q->front];
    q->front=(q->front+1)%M;
    return YES;
}
void printXBLoopQueue(XBLoopQueue q)
{
    printf("隊列的元素是:\n");
    while (!isXBLoopQueueEmpty(&q)) {
        DATATYPE e;
        delXBLoopQueueItem(&q, &e);
        printf("%d  ",e);
    }
    printf("\n");

}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章