数据结构:循环队列的顺序存储结构

队列只允许在队尾插入,在队头删除
循环队列防止假溢出现象
顺序存储结构用数组实现

#include 
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 6
typedef int ElemType;
typedef int Status;

/* 定义顺序存储结构的循环队列:SqQueue(循环队列防止假溢出)
 * 思路:
 * 1、用数组实现
 * 2、头指针front指向队头元素的下标
 * 3、尾指针rear指向队尾元素下一个位置的下标
 */
typedef struct
{
	ElemType data[MAXSIZE];
	int front;
	int rear;
}SqQueue;

/* 循环队列的初始化:InitQueue
 * 思路:
 * 1、头指针和尾指针指向的下标位置均为0
 */
Status InitQueue(SqQueue *Q)
{
	Q->front = 0;
	Q->rear = 0;
	return 0;
}

/* 循环队列求队列长度:Queuelength
 * 思路:
 * 1、队列满的条件是:(rear+1)%MAXSIZE==front
 * 2、规定:数组中只有一个空闲单元时3,规定已满
 * 3、当rear>front时,长度为:rear-front,
 * 4、当rearrear + 1) % MAXSIZE == Q->front)
	{
		cout << "队列已满" << endl;
		return ERROR;
	}
	Q->data[Q->rear] = e;
	Q->rear = (Q->rear + 1) % MAXSIZE;
	return OK;
}

/* 循环队列的出队:只在队头出队:DeQueue,返回元素为e
 * 思路:
 * 1、判断队列是否空,空的条件是front==rear
 * 2、将队头元素返回e:e=data[front];
 * 3、将头指针front后移一位,若到数组最后则移到数组头部,即:front=(front+1)%MAXSIZE
 */
Status DeQueue(SqQueue *Q, ElemType *e)
{
	if (Q->rear == Q->front)
	{
		cout << "队列已空" << endl;
		return ERROR;
	}
	*e = Q->data[Q->front];
	Q->front = (Q->front + 1) % MAXSIZE;
	return OK;
}

/* 输出队列函数:PrinftQueue
 * 思路:
 * 1、判断队列是否为空
 * 2、由于数组中始终有一个空闲单元,所以front!=rear
 * 3、当rear>front时,按下标从front到rear-1输出
 * 4、当rearrear == Q->front)
	{
		cout << "队列已空" << endl;
		return ERROR;
	}
	if (Q->rear > Q->front)
	{
		for (i = Q->front; i < Q->rear; i++)
		{
			cout << Q->data[i] << ' ';
		}
	}
	else
	{
		for (i = Q->front; i < MAXSIZE; i++)
		{
			cout << Q->data[i] << ' ';
		}
		for (i = 0; i < Q->rear ; i++)
		{
			cout << Q->data[i] << ' ';
		}
	}
	return OK;
}

int main()
{
	SqQueue Q;
	InitQueue(&Q);
	int i,j,k,l,m,n;

	cout << "队列最大长度:" << MAXSIZE-1 << endl;

	cout << "输入入队元素个数:";
	cin >> i;
	cout << "依次入队元素:";
	for (j = 0; j < i; j++)
	{
		cin >> k;
		EnQueue(&Q, k);
	}

	cout << "输出队列:";
	PrinftQueue(&Q);
	cout << endl;

	int length;
	cout << "输出队列长度:";
	length = Queuelength(Q);
	cout << length << endl;

	cout << "输入出队元素个数:";
	cin >> l;
	cout << "输出出队元素:";
	for (j = 0; j < l; j++)
	{
		DeQueue(&Q, &m);
		cout << m << ' ';
	}
	cout << endl;

	cout << "输出队列:";
	PrinftQueue(&Q);
	cout << endl;

	cout << "输出队列长度:";
	length = Queuelength(Q);
	cout << length << endl;

	cout << "输入入队元素个数:";
	cin >> n;
	cout << "依次入队元素:";
	for (j = 0; j < n; j++)
	{
		cin >> k;
		EnQueue(&Q, k);
	}

	cout << "输出队列:";
	PrinftQueue(&Q);
	cout << endl;

	cout << "输出队列长度:";
	length = Queuelength(Q);
	cout << length << endl;


	return 0;


}

结果为:
数据结构:循环队列的顺序存储结构_第1张图片

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