数组模拟循环队列避免存储空间浪费和数组溢出但是又有新的问题

/* 【注意】新的问题
使用此方法需要注意的是,顺序队列在判断数组是否已满时,出现下面情况:
当队列为空时,队列的头指针等于队列的尾指针;
当数组满员时,队列的头指针等于队列的尾指针;
*/

#include
//使用环形数组解决数组模拟队列空间浪费的问题
/*
顺序队列整体后移造成的影响是:
顺序队列之前的数组存储空间将无法再被使用,造成了空间浪费;
如果顺序表申请的空间不足够大,则直接造成程序中数组 a 溢出,产生溢出错误;
*/
#define max 5 //申请队列数组存储空间
//入队
/*
  入队思想   rear+1(入队在队尾加一)
    添加判断语句 如果rear超过max则重新从a[0]开始存储如果rear+1和front重合则,则表示数组已满
	顺序队列的存储状态不同,但是判断条件相同。为了对其进行区分,
	最简单的解决办法是:
	牺牲掉数组中的一个存储空间,判断数组满员的条件是:尾指针的下一个位置和头指针相遇,就说明数组满了,
*/
int enQueue(int *a,int front,int rear,int data) {
	if ((rear+1)%max==front) {   
		printf("空间已满\n");
		return rear;
	 }
	a[rear%max] = data;
	rear++;
	return rear;
}
//出队思想
/*
  出队则是在top+1【对头加一】
  出队必须要判断队列是否为空
  判断方法:
  如果rear=front则表示队列已空
*/

int deQueue(int *a,int front,int rear) {
	if (front==rear%max) {
		printf("队列已空\n");
		return front;
	}
	printf("出栈数据%d\n",a[front]);
	//front不再直接+1 而是+1后和max比较 如果=max 则直接跳转到a[0]
	front = (front + 1) % max;
	return front;
}

int main() {
	int a[max];
	int front, rear;
	//设置队头指针和队尾指针,当队列满时指向同一块地址
	front = rear = 0;
	//入队
	rear = enQueue(a, front, rear, 1);
	rear = enQueue(a, front, rear, 2);
	rear = enQueue(a, front, rear, 3);
	rear = enQueue(a, front, rear, 4);
	//出队
	front = deQueue(a, front, rear);
	//再入队
	rear = enQueue(a, front, rear, 5);
	//再出队
	front = deQueue(a, front, rear);
	//再入队
	rear = enQueue(a, front, rear, 6);
	//再出队
	front = deQueue(a, front, rear);
	front = deQueue(a, front, rear);
	front = deQueue(a, front, rear);
	front = deQueue(a, front, rear);
	return 0;
}

 

你可能感兴趣的:(C++,算法学习,数据结构与算法)