数据结构笔记

24、队列的算法实现(数组)

队列是一种受限的线性表,(Queue),它是一种运算受限的线性表,先进先出,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。

采用数组来保存队列的元素,设立一个队首指针front ,一个队尾指针rear,分别指向队首和队尾元素。则 rear-front即为存储的元素个数!
在这里插入图片描述
1、队列的初始化

#define MaxSize 5 //队列最大容量
typedef int DataType;//队列中元素类型

typedef struct Queue{
	DataType queue[MaxSize];
	int front;//队头指针
	int rear;//队尾指针
}SeqQueue;
void InitQueue(SeqQueue *SQ){
	if(!SQ)return;
	SQ->front = SQ->rear = 0;//将队头和队尾指针同时置0
}

2、判断队列是否已满

bool IsFull(SeqQueue *SQ){
	if(SQ->rear == MaxSize){
		return true;
	}
	return false;
}

3、判断队列是否为空

bool IsEmpty(SeqQueue *SQ){
	if(SQ->rear ==SQ->front){
		return true;
	}
	return false;
}

4、入队,将元素data插入到队列SQ中

int EnterQueue(SeqQueue* SQ,DataType data){
	if(IsFull(SQ)){
		cout<<"无法插入元素"<<data<<",队列已满!"<<endl;
		return 0;
	}
	SQ->queue[SQ->rear] = data;//在队尾插入元素data
	SQ->rear++;//队尾指针后移一位
	return 1;
}

5-1、出队(方法1),将队列中队头的元素data出队,后面的元素向前移动

int DeleteQueue1(SeqQueue* SQ,DataType *data){
	if(!SQ || IsEmpty(SQ)){
		cout<<"队列为空!"<<endl;
		return 0;
	}
	if(!data)retrun 0;
	
	*data = SQ->queue[SQ->front];//将要出队的数据赋值给data指针指向的地址
	for(int i =SQ->front+1;i<SQ->rear;i++){
		SQ->queue[i-1]=SQ->queue[i];
	}
	SQ->rear--;
	return 1;
}

5-2、出队(方法二),队首指针向后移动

int DeleteQueue2(SeqQueue *SQ, DataType *data) {
	if(!SQ||IsEmpty(SQ)){
		cout<<"队列为空!"<<endl;
		return 0;
	}
	if(!data)return 0;
	if(SQ->front >= MaxSize){
		cout<<"队列已到尽头!"<<endl;
		return 0;
	}
	*data = SQ->queue[SQ->front];
	SQ->front = (SQ->front)+1;
	return 1;
}

6、获取队首地址,不出队

int GetHead(SeqQueue* SQ,DataType *data){
	if(!SQ || IsEmpty(SQ)){
		cout<<"队列为空!"<<endl;
	}
	return *data = SQ->queue[SQ->front];
}

7、清空队列

void ClearQueue(SeqQueue* SQ){
	SQ->front = SQ->rear = 0;
}

8、获取队列中元素的个数

int getLength(SeqQueue* SQ){
	if(!SQ)return 0;
	return SQ->rear-SQ->front;
}

打印队列中的元素

void PrintQueue(SeqQueue* SQ){
	if(!SQ)return;
	
	int i=SQ->front;
	while(i<SQ->rear){
		cout<<SQ->queue[i];
		i++;
	}
	cout<<endl;
}

主函数

int main(void){
	SeqQueue *SQ = new SeqQueue;
	DataType data =-1;
	InitQueue(SQ);

	//入队
	for(int i=0;i<7;i++){
		EnterQueue(SQ,i);
	}
	//打印队列中的元素
	printf("队列中的元素:");
	PrintQueue(SQ);
	cout<<endl;
	
	//出队
	DeleteQueue1(SQ,&data);
	cout<<"出队的元素是:"<<data<<endl;

	//打印队列中的元素
	printf("出队一个元素后,队列中剩下的元素是:");
	PrintQueue(SQ);
	cout << endl;

	system("pause");
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值