[데이터 구조] 제3 장 - 창고 와 대열 (독서 노트 3)
□ 3.4 대기 열 은 스 택 과 달리 대기 열 (queue) 은 먼저 나 오 는 (first in first out) 선형 표 로 표 의 한 끝 에 만 삽입 할 수 있 고 다른 한 끝 에 요 소 를 삭제 할 수 있다.대기 열 에 삽입 할 수 있 는 한 끝 을 팀 끝 (rear) 이 라 고 하고 삭제 할 수 있 는 한 끝 을 팀 머리 (front) 라 고 합 니 다.대기 열 은 프로그램 관련 에서 도 자주 나타난다.가장 전형 적 인 예 는 운영 체제 의 작업 줄 을 서 는 것 이다.2 단 대기 열 (deque): 스 택 과 대기 열 을 제외 하고 한 정 된 데이터 구 조 는 2 단 대기 열 입 니 다.이것 은 표 의 양 끝 에 삽입 과 삭 제 를 제한 하 는 선형 표 입 니 다.
□ 3.4.2 체인 대기 열 - 대기 열의 체인 표시 와 실현 을 체인 으로 표시 하 는 대기 열 을 체인 대기 열 이 라 고 약칭 한다.하나의 체인 대열 은 분명히 두 개의 지시 팀 머리 와 팀 꼬리 의 지침 이 있어 야만 유일 하 게 확정 할 수 있다.체인 큐 의 작업 은 단일 체인 시트 의 삽입 과 삭제 작업 의 특수 한 상황 입 니 다. 다만 꼬리 지침 이나 머리 지침 을 수정 해 야 합 니 다.
typedef int QElemType;
/*----------------------------------------
------------------------------------------*/
typedef struct QNode{/* */
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
/* */
QueuePtr front,rear; /* 、 */
}LinkQueue;
Status InitQueue(LinkQueue *Q)
{ /* Q */
(*Q).front = (*Q).rear = (QueuePtr)malloc(sizeof(QNode));
if(!(*Q).front){
exit(OVERFLOW);
}
(*Q).front->next = NULL;
return OK;
}
Status DestroyQueue(LinkQueue *Q)
{ /* Q( ) */
QueuePtr p = NULL;
while((*Q).front){
p = (*Q).front->next;
free((*Q).front);
(*Q).front = p;
}
return OK;
}
Status ClearQueue(LinkQueue *Q)
{ /* Q */
QueuePtr p = NULL;
QueuePtr q = NULL;
(*Q).rear = (*Q).front;
p = (*Q).front->next;
(*Q).front->next = NULL;
while (p){
q = p;
p = p->next;
free(q);
}
return OK;
}
Status QueueEmpty(LinkQueue Q)
{ /* Q , TRUE, FALSE */
if(Q.front == Q.rear){
return TRUE;
}
else{
return FALSE;
}
}
int QueueLength(LinkQueue Q)
{ /* */
int count = 0;
QueuePtr p = Q.front;
while (Q.rear != p){
p = p->next;
count++;;
}
return count;
}
Status EnQueue(LinkQueue *Q, QElemType e)
{ /* e Q */
QueuePtr p = NULL;
p = (QueuePtr)malloc(sizeof(QNode));
p->data = e;
p->next = NULL;
(*Q).rear->next = p;
(*Q).rear = p;
return OK;
}
Status DeQueue(LinkQueue *Q, QElemType *e)
{ /* , Q , e , OK, ERROR */
QueuePtr p = NULL;
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;
}
free(p);
p = NULL;
return OK;
}
Status QueueTraverse(LinkQueue Q,void(*vi)(QElemType))
{ /* Q vi()。 vi , */
QueuePtr p = NULL;
p = Q.front->next;
while(p){
vi(p->data);
p = p->next;
}
printf("
");
return OK;
}
Status GetHead_Q(LinkQueue Q, QElemType *e) /* bo2-6.c */
{ /* , e Q , OK, ERROR */
QueuePtr p = NULL;
if (Q.front == Q.rear){
return ERROR;
}
p = Q.front->next;
*e = p->data;
return OK;
}
void visit(QElemType i)
{
printf("%d ",i);
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
QElemType d;
LinkQueue q;
i=InitQueue(&q);
if(i){
printf(" !
");
}
printf(" ?%d(1: 0: ) ",QueueEmpty(q));
printf(" %d
",QueueLength(q));
EnQueue(&q,-5);
EnQueue(&q,5);
EnQueue(&q,10);
printf(" 3 (-5,5,10) , %d
",QueueLength(q));
printf(" ?%d(1: 0: ) ",QueueEmpty(q));
printf(" :");
QueueTraverse(q,visit);
i = GetHead_Q(q,&d);
if(i == OK){
printf(" :%d
",d);
}
DeQueue(&q,&d);
printf(" %d
",d);
i = GetHead_Q(q,&d);
if(i == OK){
printf(" :%d
",d);
}
ClearQueue(&q);
printf(" ,q.front=%u q.rear=%u q.front->next=%u
",q.front,q.rear,q.front->next);
DestroyQueue(&q);
printf(" ,q.front=%u q.rear=%u
",q.front, q.rear);
return 0;
}
□ 3.4.3 순환 대기 열 - 대기 열의 순서 표시 와 실현 은 대기 열의 순서 저장 구조 에서 한 그룹의 주소 로 연속 적 인 저장 장치 로 대기 열 머리 에서 대기 열 꼬리 까지 의 요 소 를 순서대로 저장 하 는 것 을 제외 하고 두 개의 포인터 front 와 rear 를 추가 하여 각각 대기 열 머리 요소 와 대기 열 꼬리 요소 의 위 치 를 표시 해 야 한다.대기 열 헤드 포인터 로 대기 열 꼬리 포인터 의 다음 위치 (반지 위의 다음 위치) 에 대기 열 이 가득 찬 상태 로 표 시 됩 니 다.C 언어 에 서 는 동적 으로 분 배 된 1 차원 배열 로 순환 대기 열 을 실현 할 수 없습니다.사용자 의 프로그램 에 순환 대기 열 이 설치 되 어 있다 면 최대 대기 열 길 이 를 설정 해 야 합 니 다.사용자 가 사용 하 는 대기 열의 최대 길 이 를 예측 할 수 없다 면 체인 대기 열 을 사용 하 는 것 이 좋 습 니 다.
/*---------------------------------------------
---------------------------------------------*/
typedef int QElemType;
/* ( , 1) */
#define MAXSIZE 5
typedef struct {
QElemType *base; /* */
int rear; /* , , */
int front; /* , , */
}SqQueue;
/* bo3-3.c ( c3-3.h ) (9 ) */
Status InitQueue(SqQueue *Q)
{ /* Q */
(*Q).base = (QElemType *)malloc(MAXSIZE * sizeof(QElemType) );
if(!(*Q).base){ /* */
exit(OVERFLOW);
}
(*Q).front = (*Q).rear = 0;
return OK;
}
Status DestroyQueue(SqQueue *Q)
{ /* Q,Q */
if((*Q).base){
free((*Q).base);
}
(*Q).base = NULL;
(*Q).front = (*Q).rear = 0;
return OK;
}
Status ClearQueue(SqQueue *Q)
{ /* Q */
(*Q).front = (*Q).rear = 0;
return OK;
}
Status QueueEmpty(SqQueue Q)
{ /* Q , TRUE, FALSE */
if(Q.front==Q.rear){ /* */
return TRUE;
}
else{
return FALSE;
}
}
int QueueLength(SqQueue Q)
{ /* Q , */
return ( Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
Status GetHead(SqQueue Q,QElemType *e)
{ /* , e Q , OK, ERROR */
if(Q.front == Q.rear){
return ERROR;
}
*e = *(Q.base + Q.front);
return OK;
}
Status EnQueue(SqQueue *Q,QElemType e)
{ /* e Q */
/* */
if (((*Q).rear + 1) % MAXSIZE == (*Q).front ){
return ERROR;
}
(*Q).base[(*Q).rear] = e;
(*Q).rear = ((*Q).rear + 1) % MAXSIZE;
return OK;
}
Status DeQueue(SqQueue *Q,QElemType *e)
{ /* , Q , e , OK; ERROR */
if ((*Q).rear == (*Q).front){/* */
return ERROR;
}
*e = (*Q).base[(*Q).front];
(*Q).front = ((*Q).front + 1) % MAXSIZE;
return OK;
}
Status QueueTraverse(SqQueue Q,void(*vi)(QElemType))
{ /* Q vi(). vi , */
int pos = Q.front;
while (pos != Q.rear){
vi(Q.base[pos]);
pos = (pos + 1) % MAXSIZE;
}
printf("
");
return OK;
}
void visit(QElemType i)
{
printf("%d ",i);
}
int _tmain(int argc, _TCHAR* argv[])
{
Status j;
int i=0,l;
QElemType d;
SqQueue Q;
InitQueue(&Q);
printf(" , ?%u(1: 0: )
",QueueEmpty(Q));
printf(" ( %d ),-1 : ",MAXSIZE-1);
do
{
scanf("%d",&d);
if(d==-1)
break;
i++;
EnQueue(&Q,d);
}while(i<MAXSIZE-1);
printf(" : %d
",QueueLength(Q));
printf(" ?%u(1: 0: )
",QueueEmpty(Q));
printf(" %d , :
",MAXSIZE);
for(l=1;l<=MAXSIZE;l++)
{
DeQueue(&Q,&d);
printf(" %d, : ",d);
scanf("%d",&d);
EnQueue(&Q,d);
}
l=QueueLength(Q);
printf(" :
");
QueueTraverse(Q,visit);
printf(" %d
",i+MAXSIZE);
if(l-2>0)
printf(" %d :
",l-2);
while(QueueLength(Q)>2)
{
DeQueue(&Q,&d);
printf(" %d
",d);
}
j=GetHead(Q,&d);
if(j)
printf(" : %d
",d);
ClearQueue(&Q);
printf(" , ?%u(1: 0: )
",QueueEmpty(Q));
DestroyQueue(&Q);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.