キューの作成と基本操作
キュー(FIFO)は一部だけ挿入し、他端は削除することができる線形表で、先入先出原則に従い、隊頭は削除し、列の最後に挿入する.
順番待ち行列
使用用配列保存 初期条件front=rear=0満行列:rear=m 容量m
空き行列: front=rear
構造:
frontはチームの頭の要素を指し、rearはチームの最後の要素の次の位置を指します.
front=rearの時は空き列です.
以下にいくつかの公式があります.
1.列の最大サイズMAXを設定し、列がいっぱいになる条件は.
(rear+1)%MAX==front
2.一般的な計算キューの長さの公式:
(rear-front+MAX)%MAX
ループキューの順序格納構造.
後進頭に相当するチェーン時計
frontは、最初の結点ではなく、最後の結点を指す.
構造は以下の通りです
順番待ち行列
使用用配列保存 初期条件front=rear=0満行列:rear=m 容量m
空き行列: front=rear
構造:
typedef struct
{
int data[MAX];
int front,rear;
}Queue;
操作:/
Queue InitQueue()
{
Queue p;
p.front=p.rear=0;
return p;
}
//
int InQueue(Queue *p,int e)
{
p->data[++p->rear]=e;
if(p->rear>MAX)
return 0;
else
{
printf("
");
return 1;
}
}
//
int DeQueue(Queue *p,int *e)
{
if(p->front==p->rear)
return 0;
else
{
p->front++; //
printf("
");
return 0;
}
}
テスト:#include
#include
#define MAX 10
// ,
// front =rear=0
// :rear=m m
// front=rear
typedef struct
{
int data[MAX];
int front,rear;
}Queue;
//
Queue InitQueue()
{
Queue p;
p.front=p.rear=0;
return p;
}
//
int InQueue(Queue *p,int e)
{
p->data[++p->rear]=e;
if(p->rear>MAX)
return 0;
else
{
printf("
");
return 1;
}
}
//
int DeQueue(Queue *p,int *e)
{
if(p->front==p->rear)
return 0;
else
{
p->front++; //
printf("
");
return 0;
}
}
//
void print(Queue *p)
{
while(p->frontrear+1))
{
printf("%d",p->data[p->front]);
p->front++;
}
}
int main()
{
int a;
Queue p;
InitQueue();
InQueue(&p,1);
InQueue(&p,2);
InQueue(&p,3);
InQueue(&p,4);
DeQueue(&p,&a);
print(&p);
return 0;
}
巡回キューfrontはチームの頭の要素を指し、rearはチームの最後の要素の次の位置を指します.
front=rearの時は空き列です.
以下にいくつかの公式があります.
1.列の最大サイズMAXを設定し、列がいっぱいになる条件は.
(rear+1)%MAX==front
2.一般的な計算キューの長さの公式:
(rear-front+MAX)%MAX
ループキューの順序格納構造.
typedef struct
{
int data[MAX];
int front,rear;
}SQueue;
基本操作://
int InitQueue(SQueue *q)
{
q->front=0;
q->rear=0;
return 1;
}
//
int QueueLength(SQueue *q)
{
return (q->rear-q->front+MAX)%MAX;
}
//
int EnQueue(SQueue *q,int e)
{
if((q->rear+1)%MAX==q->front) //
return 0;
q->data[q->rear]=e;
q->rear=(q->rear+1)%MAX; // rear
return 1;
}
//
int DeQueue(SQueue *q,int *e)
{
if(q->front==q->rear) //
return 0;
*e=q->data[q->front];
q->front=(q->front+1)%MAX; //front
return 1;
}
テストコード:#include
#include
#define MAX 10
//
typedef struct
{
int data[MAX];
int front,rear;
}SQueue;
//
int InitQueue(SQueue *q)
{
q->front=0;
q->rear=0;
return 1;
}
//
int QueueLength(SQueue *q)
{
return (q->rear-q->front+MAX)%MAX;
}
//
int EnQueue(SQueue *q,int e)
{
if((q->rear+1)%MAX==q->front) //
return 0;
q->data[q->rear]=e;
q->rear=(q->rear+1)%MAX; // rear
return 1;
}
//
int DeQueue(SQueue *q,int *e)
{
if(q->front==q->rear) //
return 0;
*e=q->data[q->front];
q->front=(q->front+1)%MAX; //front
return 1;
}
//
void print(SQueue *q)
{
while(q->front!=q->rear)
{
printf("%d",q->data[q->front]);
q->front++;
}
}
int main()
{
int a,b;
SQueue q;
InitQueue(&q);
EnQueue(&q,1);
EnQueue(&q,2);
EnQueue(&q,3);
EnQueue(&q,4);
DeQueue(&q,&a);
printf(" :%d",QueueLength(&q));
printf(" :");
print(&q);
return 0;
}
チェーン・キュー後進頭に相当するチェーン時計
frontは、最初の結点ではなく、最後の結点を指す.
構造は以下の通りです
typedef struct QNode
{
int data;
struct QNode *next;
}QNode,QNodePtr;
typedef struct
{
QNodePtr front,rear;
}LinkQueue;
基本操作://
LinkQueue InitQueue(LinkQueue *p)
{
p->front=p->rear=(QNodePtr)malloc(sizeof(QNode));
if(!p->front)
return 0;
p->front->next=p->front->next=NULL;
return p;
}
//
int EnQueue(LinkQueue *q,int e)
{
QNodePtr s=(QNodePtr)malloc(sizeof(QNode));
s->data=e;
s->next=NULL;
q->rear->next=s;
q->rear=s; // rear
return 1;
}
//
int DeQueue(LinkQueue *q,int *e)
{
QNodePtr p; //
if(q->front==q->rear) //
return 0;
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p) // rear
q->rear=q->front;
free(p);
return 1;
}
テストコード:#include
#include
//
//front ,rear ,
typedef struct QNode
{
int data;
struct QNode *next;
}QNode,*QNodePtr;
typedef struct
{
QNodePtr front,rear;
}LinkQueue;
//
int InitQueue(LinkQueue *p)
{
p->front=p->rear=(QNodePtr)malloc(sizeof(QNode));
if(!p->front)
return 0;
p->front->next=p->rear->next=NULL;
return 1;
}
//
int EnQueue(LinkQueue *q,int e)
{
QNodePtr s=(QNodePtr)malloc(sizeof(QNode));
s->data=e;
s->next=NULL;
q->rear->next=s;
q->rear=s; // rear
return 1;
}
//
int DeQueue(LinkQueue *q,int *e)
{
QNodePtr p; //
if(q->front==q->rear) //
return 0;
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p) // rear
q->rear=q->front;
free(p);
return 1;
}
void print(LinkQueue q)
{
while(q.front!=q.rear)
{
q.front=q.front->next; // front
printf("%d
",q.front->data);
}
}
int main()
{
int a;
LinkQueue q;
InitQueue(&q);
EnQueue(&q,1);
EnQueue(&q,2);
EnQueue(&q,3);
EnQueue(&q,4);
DeQueue(&q,&a);
print(q);
return 0;
}