数据结构练习-循环队列

介绍

循环队列是在顺序队列的基础上,解决“假溢出”问题的一种数据结构。在逻辑上可以看做一个环,如下图所示:
数据结构练习-循环队列_第1张图片

思路

  • 分配一个大小为MAXSIZE的连续空间,初始化q.front = q.rear = 0。
  • 进队q.base[rear++] = x,rear始终指向下一次要入队的位置。出队x = q.base[front++]。
  • 边界判断,这里采用设标志位的方法。当q.rear == q.front && q.tag == 1时,队列满;当q.rear == q.front && q.tag == 0时,队列空。

代码实现

#include

typedef int QElemType;

#define MAXSIZE  20 
typedef struct {
	QElemType *base;
	int front;   
	int rear;  
	int tag;
}CirQueue;

int InitQueue (CirQueue &Q) {
	Q.base = new QElemType[MAXSIZE];
    if(!Q.base) 
		exit (1);                                  
    Q.front = Q.rear = 0;
	Q.tag = 0;
    return 0;
}

int EnQueue (CirQueue &Q, QElemType &e) { 
    if (Q.rear == Q.front && Q.tag) {
		printf("队列满\n");
		system("pause");
		exit(1);
	}
    Q.base[Q.rear] = e;
	Q.rear = (Q.rear + 1) % MAXSIZE;
	Q.tag = 1;
    return 0;
}

QElemType DeQueue(CirQueue &Q) {
    if (Q.front == Q.rear && !Q.tag) {
		printf("队列空\n");
		system("pause");
		exit(1);
	}
    QElemType e = Q.base[Q.front];
    Q.front = (Q.front + 1) % MAXSIZE;
	Q.tag = 0;
    return e;
}

int main(int argc, char const *argv[]) {
	QElemType homework = 0;
	CirQueue S;
	InitQueue(S);    
	printf("Homework print: \n");
	//加入队列
	printf("EnQueue:");
	for(int i = 0; i < MAXSIZE; i++)
	{
		printf("%d ",homework);
		EnQueue(S, homework); 
		homework++;
	}
	//出队
	printf("\nDeQueue:");
	for(int i = 0; i < 10; i++)
	{
		printf("%d ",DeQueue(S));
	}
	//再次入队
	printf("\nEnQueue:");
	for(int i = 0; i < 10; i++)
	{
		printf("%d ",homework);
		EnQueue(S, homework); 
		homework++;
	}
	//再次出队
	printf("\nDeQueue:");
	for(int i = 0; i < MAXSIZE; i++)
	{
		printf("%d ", DeQueue(S));
	}
	system("pause");
	return 0;
}

最后

  • 由于博主水平有限,难免有疏漏之处,欢迎读者批评指正!

你可能感兴趣的:(DataStructure,数据结构,队列)