【数据结构】循环队列

#define MAXSIZE 10
typedef struct
{
	int data[MAXSIZE];
	int head;
	int rear;
}loopQueue;

循环队列结构体,尾节点不存放元素。

int getLength_loopQueue(loopQueue *queue)
{
	return (queue->rear + MAXSIZE - queue->head) % MAXSIZE;
}

获取长度:循环队列中,空了一格。不用于存放数据。所以长度应该是(尾-头)即可。多了MAXSIZE,是为了处理循环队列,尾节点在数组的位置靠前,而头在尾节点的后面。

bool initQueue(loopQueue *queue)
{
	queue->data[0] = 0;
	queue->head = 0;
	queue->rear = 0;
	return true;
}
bool enQueue(loopQueue *queue, int data)
{
	if ((queue->rear + 1) % MAXSIZE == queue->head)
	{
		cout << "队列满!" << endl;
		return false;
	}
	queue->data[queue->rear] = data;
	queue->rear = (queue->rear + 1) % MAXSIZE;
	return true;
}
入队操作:首先,判断表满的条件是:
(queue->rear + 1) % MAXSIZE == queue->head

而表空的条件是queue->rear==queue->head。

这样子就可以区分开表空和表满了。

在(queue->rear + 1) % MAXSIZE == queue->head的条件下,队列只能储存MAXSIZE-1个元素,最后一个位置不能存入元素。

bool deQueue(loopQueue *queue)
{
	if (queue->head == queue->rear)
	{
		cout << "空!" << endl;
		return false;
	}
	queue->head = (queue->head+1) % MAXSIZE;
	return true;
}
void show_Queue(loopQueue queue)
{
	if (queue.head == queue.rear)
	{
		cout << "显示操作:表空!" << endl;
		return;
	}

	for (int i = queue.head; i <= queue.rear-1; i++)
	{
		cout << queue.data[i] << " ";
	}

	cout << endl;
	return;
}

值得注意的是这个显示所有的遍历操作,i只能循环到queue.rear-1,因为尾节点不存放元素。

void deleteAllQueue(loopQueue *queue)
{
	while (deQueue(queue));
}



猜你喜欢

转载自blog.csdn.net/qq_35564841/article/details/80588725