佇列 和 迴圈佇列

小魚兒12發表於2020-10-18

佇列也是一種運算受限制的線性表,它只允許在表的一端進行插入,而另外一段只允許進行刪除。

允許刪除的一端稱為隊頭(Front);允許刪除的一端稱為隊尾(Rear)。

順序佇列實際上是受限的順序表,和順序表一樣,順序佇列也必須採用一個陣列來存放當前資料元素。

當隊尾(Rear)達到 最大位置時(Maxsize)。 表示此時空間不足,已經不能在入隊了。但是隨著我們出隊Front 向前移動, (0~Front) 的空間是剩餘的。 我們稱這種現象為假上溢。

為了克服假上溢現象:我們講佇列的頭尾連起來形成一個環(迴圈佇列), (即 原來 -1 的位置就是現在 Maxsize -1 的位置)

迴圈佇列每次移動思路:

每次移動 Rear = (Rear +1)%Maxsize;

每次移動Front = (Front +1)%Maxsize;

 

順序佇列

#include<iostream>
#include<cstdio>
using namespace std;
const int Maxsize=1000;
typedef struct node{
    int data[Maxsize];
    int Front,Rear;///頭指標和尾指標,分別指向隊頭和隊尾
}*Sq;
void Init_Sequeue(Sq &Q){
     Q->Front=-1;
     Q->Rear=-1;
}
int Out_Queue(Sq &Q){///獲取隊頭元素
   if(Q->Front>=Q->Rear)
    cout<<"Queue id NULL"<<endl;
   else
   {
       Q->Front++;
       return Q->data[Q->Front];
   }
}
void In_Queue(Sq &Q,int e){///入隊
   if(Q->Rear>=Maxsize-1)
    cout<<"Queue is overfloor"<<endl;
   else{
    Q->Rear++;
    Q->data[Q->Rear]=e;
   }
}
int main(){
     Sq Q=(Sq)malloc(sizeof(Sq));
     Init_Sequeue(Q);
     int n,i;
     cin>>n;///入隊5個數
      for(i=1;i<=n;i++)
        In_Queue(Q,i);
    cout<<"出隊序列:";
     for(i=1;i<=n;i++)
        cout<<Out_Queue(Q)<<" ";
    return 0;
}

 

迴圈佇列(順序儲存)

#include<iostream>
#include<cstdio>
using namespace std;
const int Maxsize = 1000;
typedef struct node{
   int data[Maxsize];
   int Front,Rear;
}*Sq;
void Init_Queue(Sq &Q){///置空迴圈佇列
    Q->Front=Maxsize-1;
    Q->Rear=Maxsize-1;
}
bool is_Empty(Sq Q){///判空
  if(Q->Front==Q->Rear)
         return true;
     else
    return false;
}
void In_Queue(Sq &Q,int e){///入隊
    if(Q->Front==((Q->Rear+1)%Maxsize)){///隊以滿,上溢; 在移動 Front 以前判斷之前的尾巴Rear 在移動一個是不是隊為,如果是,這表是滿了
     cout<<"Queue is overfloor"<<endl;
    }
    else{
        Q->Rear=(Q->Rear+1)%Maxsize;///
        Q->data[Q->Rear]=e;
    }
}
int  Out_Queue(Sq &Q){///出隊
    if(is_Empty(Q))
        cout<<"Queue is underfloor"<<endl;
    else
        Q->Front=(Q->Front+1)%Maxsize;
        return Q->data[Q->Front];
}
int GET_head_Queue(Sq Q){///獲取當前對頭元素
     if(is_Empty(Q))
       {
            cout<<"Queue is NULL"<<endl;
       }
    else{
         int id=(Q->Front+1)%Maxsize;
        return Q->data[id];
    }
}
int main()
{
    Sq Q=(Sq)malloc(sizeof(Sq));
    Init_Queue(Q);
    int n,i;
    cin>>n;
    for(i=1;i<=n;i++)
    In_Queue(Q,i);
    cout<<"獲取當前隊頭元素:"<<GET_head_Queue(Q)<<endl;
    cout<<"依次出隊:"<<endl;
    for(i=1;i<=n;i++)
    cout<<Out_Queue(Q)<<" ";
    cout<<endl;
    return 0;
}

 

相關文章