四、数据结构之队列

  1. 结构体定义
  2. 基础操作
  3. 例题

结构体定义

typedef struct{
	int data[MaxSize];
	int front,rear;
}SqQueue;

基础操作 

1.初始化队列

void InitQu(SqQueue &Q){
	Q.front=Q.rear=0;
} 

 2.判断是否为空

bool isEmpty(SqQueue Q){
	if(Q.front==Q.rear){//队满应该是 (Q.rear+1)%MaxSize==Q.front
		return 1;
	}else{
		return 0;
	}
}

3.入队

bool enQue(SqQueue &Q,int x){
	if((Q.rear+1)%MaxSize==Q.front) return 0;
	Q.data[Q.rear]=x;
	Q.rear=(Q.rear+1)%MaxSize;
	return 1; 
}

4.出队

 

bool DeQue(SqQueue &Q,int &x){
	if(Q.front==Q.rear) return 0;
	x=Q.data[Q.front];
	Q.front=(Q.front+1)%MaxSize;
	return 1;
}

 5.读队头元素

bool getHead(SqQueue Q,int &x){
	if(Q.front==Q.rear) return 0;
	x=Q.data[Q.front];
	return 1;
}

例题 

1.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针,请写出对应入队出队算法

void enQue1(LNode *&rear,int x){
	LNode *s=(LNode *)malloc(sizeof(LNode));
	s->data=x;
	s->next=rear->next;
	rear->next=s;
	rear=s; 
	
} 
bool DeQue1(LNode *&rear,int x){
	LNode *s;
	if(rear->next==rear) return 0;
	else{
		s=rear->next->next;
		rear->next->next=s->next;
		x=s->data;
		if(s==rear) rear=rear->next;
		free(s);
		return 1;
	}
}

2.如果允许在循环队列的两端进行插入和删除操作,要求:写出循环队列的类型定义,分别写出队尾删除和对头插入的算法(和正常的出队入队有稍微出入)

typedef struct{
	int data[MaxSize];
	int front,rear;
}cyQueue; 
bool deQue2(cyQueue &Q,int &x){
	if(Q.front==Q.rear) return 0;
	else{
		x=Q.data[Q.rear];
		Q.rear=(Q.rear-1)%MaxSize;
		return 1; 
	}
}
bool enQue2(cyQueue &Q,int x){
	if(Q.rear==(Q.front-1+MaxSize)%MaxSize) return 0;
	else{
		Q.data[Q.front]==x;
		Q.front=(Q.front-1+MaxSize)%MaxSize;
		return 1;
	}
}

 3.设计一个循环队列,用front和rear作为对头和队尾指针,另外用一个tag标志表示队列是否为空,当tag=0为空,为1不空这样当rear=front时队满,请设计出结构和相关出队如对算法(标签,每次出队设置tag为0,入队设置为1,队空时tag=0,Q.front=Q.rear,队满时:Q.front=Q.rear)

typedef struct{
	int data[MaxSize];
	int front,rear;
	int tag;
}cyQuetag; 
void InitCQ(cyQuetag &Q){
	Q.tag=0;
	Q.front=Q.rear=0;
}
bool isEmpt(cyQuetag Q){
	if(Q.front==Q.rear&&Q.tag==0) return 1;
	else{
		return 0;
	}
}
bool isFull(cyQuetag Q){
	if(Q.front==Q.rear&&Q.tag==1) return 1;
	else{
		return 0;
	}
}
bool enCq(cyQuetag &Q,int x){
	if(isFull(Q)) return 0;
	else{
		Q.rear=(Q.rear+1)%MaxSize;
		Q.data[Q.rear]=x;
		Q.tag=1;
		return 1;
	}
}
bool deCq(cyQuetag &Q,int &x){
	if(isEmpt(Q)) return 0;
	else{
		x=Q.data[Q.front];
		Q.front=(Q.front+1)%MaxSize;
		Q.tag=0;
		return 1;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值