【数据结构】顺序循环队列及其实现(C语言)

给定一个大小为MAXSIZE的数组储存一个队列,经过若干次的插入和删除以后,当队尾指针 rear = MAXSIZE 时,呈现队列满的状态,而事实上数组的前部可能还有空闲的位置。为了有效地利用空间,引入循环队列(环状)。

在循环队列中,如果队列中最后一个结点存放在数组的最后一个元素位置,而数组前面有空位置的话,则下次在进行插入操作时,将插入到数组最前面那个元素的位置。其他情况下的插入操作和一般的队列的插入操作一样。

如果再插入一个新的结点,则数组空间将全部被占用,队列已满,且rear == front。

若删除一个结点,队列成为空队列,也有 rear == front。

如何区别?

方法一:

设置一个标志。由于rear+1使rear==front  -> 满队列

由于 front +1 使rear == front  -> 空队列

方法二:

牺牲一个数组元素的空间,即若数组大小为MAXSIZE,该数组所表示的循环队列最多允许储存MAXSIZE-1个结点。

循环队列满的条件:(rear+1)%MAXSIZE == front

循环队列空的条件: rear == front

#include 
#include 
const int MAXSIZE = 5;
typedef struct 
{
	int a[MAXSIZE];
	int front;
	int rear;
}sequence_queue;

void init(sequence_queue *sq)
{
	sq->front=0;
	sq->rear=0;
}

void insert(sequence_queue *sq,int x)
{
	if((sq->rear+1)%MAXSIZE==sq->front)
	{
		printf("full\n");
		return ;
	}
	sq->a[sq->rear]=x;
	sq->rear=(sq->rear+1)%MAXSIZE;
	printf("front = %d\n",sq->front);
	printf("rear = %d\n",sq->rear);
}

void del(sequence_queue *sq)
{
	if(sq->front==sq->rear)
	{
		printf("none\n");
		return ;
	}
	sq->front=(sq->front+1)%MAXSIZE;
	printf("front = %d\n",sq->front);
	printf("rear = %d\n",sq->rear);
}

void display(sequence_queue sq)
{
	int i=sq.front;
	if(sq.front==sq.rear)
	{
		printf("none\n");
		return ;
	}
	while(i!=sq.rear)
	{
		printf("%5d",sq.a[i]);
		i++;
		i=i%MAXSIZE;
	}
	printf("\n");
}

int main ()
{
	sequence_queue sq;
	int x,a;
	init(&sq);
	while(1)
	{
		scanf("%d",&x);
		switch(x)
		{
		case 1:
			{
				scanf("%d",&a);
				insert(&sq,a);
				display(sq);
				printf("\n");
				break;
			}
		case 2:
			{
				del(&sq);
				display(sq);
				printf("\n");
				break;
			}
		default:
			{
				printf("只能输入1或者2\n");
				break;
			}
		}
	}
	return 0;
}

 

你可能感兴趣的:(C/C++,算法)