순환 대기 열 에 있 는 요 소 를 배열 Q [m] 로 저장 하고 표지 tag 를 설정 합 니 다. tag = 0 과 tag = 1 로 팀 헤드 포인터 (front) 와 팀 꼬리 포인터 (rear) 가 같 을 때 대기 열 상 태 는 '빈' 인지 '만' 인지 구별 합 니 다.

/*       -           
*   85 3.7
*  :     Q[m]          ,        tag, tag=0 tag=1        (front)     (rear)   ,
*          " "  " "。
*                 (enqueue)   (dequeue)  。
*    :VC 6.0
*/
#include 
#include 

#define OK 1
#define ERROR 0
#define overflow -1
#define MAXSIZE 10

typedef int qelemType;
int count=0;

typedef struct
{
	qelemType q[MAXSIZE];
	int tag;
	int head,rear;
}sqqueue;

void initQueue(sqqueue &queue)//     
{
	queue.head=0;
	queue.rear=0;
	queue.tag=0;
}

int enqueue(sqqueue &queue,qelemType e)
{
	if(count==MAXSIZE)
		queue.tag=1;
	if(queue.tag==1 && queue.head==queue.rear)//     
		return ERROR;
	else
	{
		queue.q[queue.rear]=e;
		queue.rear=(queue.rear+1)%MAXSIZE;
		count++;
	}
	return OK;
}

int dequeue(sqqueue &queue,qelemType &e)
{
	if(count==0)
		queue.tag=0;
	if(queue.tag==0 && queue.head==queue.rear)
		return ERROR;
	else
	{
		e=queue.q[queue.head];
		queue.head=(queue.head+1)%MAXSIZE;
		count--;
	}
	return OK;
}

int queuelen(sqqueue queue)
{
	return (queue.rear-queue.head+MAXSIZE)%MAXSIZE;
}

int main()
{
	sqqueue queue1;
	initQueue(queue1);
	int num;
	for(int i=12;i>=1;i--)
	{
		printf("ATTENTION---Queue's length=%d,",queuelen(queue1));
		if(enqueue(queue1,i))
			printf("      %d!
",i); else { printf(" !
"); break; } } printf("

"); for(int k=1;k<=14;k++) { printf("ATTENTION---Queue's length=%d,",queuelen(queue1)); if(dequeue(queue1,num)) printf(" %d!
",num); else { printf(" !
"); break; } } return 0; }

좋은 웹페이지 즐겨찾기