重學資料結構:佇列的順序實現的各種操作(C語言)
阿新 • • 發佈:2020-12-23
文章目錄
佇列的順序實現定義
佇列的定義和順序表、順序棧其實差不多,只不過有兩個變數來記錄佇列頭,尾,操作不盡相同,佇列只能在尾部插入,頭部退列
typedef struct
{
int data[MaxSize];
int front,rear; //隊頭隊尾
}SqQueue;
佇列初始化
void InitSqQueue(SqQueue *Q)
{
Q->front=0;
Q->rear=0;
}
判斷隊滿
bool IsQueueFull (SqQueue Q)
{
if((Q.rear+1)%MaxSize==Q.front)
return true;
else
return false;
}
判斷隊空
bool IsQueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear)
return true;
else
return false;
}
建立佇列
bool CreateSqQueue(SqQueue *Q)
{
int data;
printf("請輸入整數:");
scanf("%d",& data);
Q->front=9; //從中間開始佇列
Q->rear=9;
int i=Q->front;
while(data!=9999&&!IsQueueFull(*Q))
{
Q->data[i]=data;
Q->rear=(Q->rear+1)%MaxSize;
i=(i+1)%MaxSize;
printf("請輸入整數:");
scanf("%d",&data);
}
return true;
}
列印佇列
void PrintSqQueue (SqQueue Q)
{
int startid=Q.front;
int endid=Q.rear;
while(startid!=endid)
{
printf("Q.data[%d]=%d\n",startid,Q.data[startid]);
startid=(startid+1)%MaxSize;
}
}
入隊
bool EnQueue(SqQueue *Q,int e)
{
if(IsQueueFull(*Q))return false;
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MaxSize;
return true;
}
退隊
int DeQueue(SqQueue *Q)
{
if(IsQueueEmpty(*Q))return false;
int e=Q->data[Q->front];
Q->front=(Q->front+1)%MaxSize;
return e;
}
測試程式碼
int main(int argc, char* argv[])
{
SqQueue Q;
InitSqQueue(&Q);
CreateSqQueue(&Q);
PrintSqQueue(Q);
printf("EnQueue(&Q,999)\n");
EnQueue(&Q,999);
PrintSqQueue(Q);
int e=DeQueue(&Q);
printf("DeQueue(&Q)=%d\n",e);
PrintSqQueue(Q);
//printf("11求餘10=%d",11%10);
}
測試結果
請輸入整數:11
請輸入整數:22
請輸入整數:33
請輸入整數:44
請輸入整數:55
請輸入整數:66
請輸入整數:9999
Q.data[9]=11
Q.data[0]=22
Q.data[1]=33
Q.data[2]=44
Q.data[3]=55
Q.data[4]=66
EnQueue(&Q,999)
Q.data[9]=11
Q.data[0]=22
Q.data[1]=33
Q.data[2]=44
Q.data[3]=55
Q.data[4]=66
Q.data[5]=999
DeQueue(&Q)=11
Q.data[0]=22
Q.data[1]=33
Q.data[2]=44
Q.data[3]=55
Q.data[4]=66
Q.data[5]=999
Press any key to continue