数据结构之队列·循环队列

参考书籍:严蔚敏《数据结构》

事先应知小知识:

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char *ch = (char*)malloc(sizeof(char));
	ch[0] = 'a';
	ch[1] = 'b';
	ch[2] = 'c';
	
	for(int i = 0;i<3;i++)
		printf("ch[%d] = %c\n",i,ch[i]);
	
	return 1;
}

循环队列使用游标模拟指针。当循环队列为空时,Q.front 等于 Q.rear,当队列满时,Q.front也等于Q.rear。所以此处空出最后一个元素,当表示结尾的指针rear加1等于头指针front时,头尾指针相遇,表示循环队列已经满了,不能再放入数据。

本例中插入12个元素,最大空间只有10个(MAXSIZE = 10),由于空着一个来元素来判断空还是满,故只能插入9个数据,3个数据插入失败。

//循环队列 
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10

typedef struct{
	char *base;//初始化的动态分配存储空间 
	int front;//头指针,队列不空时指向头元素 
	int rear;//尾指针,队列不空时指向尾元素 
}sqQueue;

//初始化结构体,为结构体中的指针变量base分配内存
int initQueue(sqQueue* Q)
{
	Q->base = (char*)malloc(MAXSIZE*sizeof(char)); 
	if(!Q->base)return 0;
	Q->front = Q->rear = 0;
	return 1;
}

int QueueLength(sqQueue* Q)
{
	return (Q->rear - Q->front + MAXSIZE)%MAXSIZE;
}

//插入一个元素ch,插入之前判断循环队列是否已满。
int enQueue(sqQueue* Q,char ch)
{
	if((Q->rear+1)%MAXSIZE == Q->front){printf("insert failed!\n");return 0;}
	Q->base[Q->rear] = ch;
	Q->rear = (Q->rear+1)%MAXSIZE;
	return 1;
} 

//删除一个元素,并用参数ch存储删除的元素。当头指针和尾指针相等,说明队列为空
int deQueue(sqQueue* Q,char *ch)
{
	if(Q->front == Q->rear)return 0;
	*ch = Q->base[Q->front];
	Q->front = (Q->front + 1)%(MAXSIZE);
	return 1;
}

//显示该队列所有元素。如果队列为空,返回。
void display(sqQueue Q)
{
	if(Q.rear == Q.front){printf("empty queue!\n");return;}
	do{
		printf("%2d ---- >%c\n",Q.front,Q.base[Q.front]);
		Q.front = Q.front + 1;
	}while(Q.front != Q.rear);
	printf("\ndisplay over\n");
}

int main()
{
	sqQueue Queue;
    char c;
	printf("sizeof(Queue) = %d\n",sizeof(Queue));//一个结构体的大小,等于4+4+8 = 16;
	initQueue(&Queue);
	for(int j = 0;j<12;j++)
		enQueue(&Queue,'a'+j);
    //MAXSIZE的大小是10,那么for循环中将有3个元素无法插入
	display(Queue);
	deQueue(&Queue,&c);//删除第一个元素
	display(Queue);
	return 1;
}

若觉得脑子糊涂了,请看看数据结构的循环队列部分的内容,多多领会。

posted @ 2019-08-18 15:33  昨夜昙花  阅读(15)  评论(0)    收藏  举报