队列的顺序存储结构中的两种处理方式,少一个队列单元和增加一个数据成员

队列:一种操作受限的线性表,只允许一段插入,而在另一端进行删除。

队头:允许删除的一端

队尾:允许插入的一端

1.队列中入队时要少用一个处理单元

(1)初始时:Q.front = Q,rear = 0

(2)队首指针进1:Q.front = (Q.front+1)%maxsize

  (3)队尾指针进1:Q,rear = (Q.rear+1)%maxsize

(4)队列长度:(Q.rear-Q.front+maxsize)%maxsize

初始化

//初始化
void InitQueue(SqQueue &Q)
{
	Q.front = Q.rear = 0;
}

判断空:Q.front与Q.rear指向的是队列同一个位置,说明出队和入队是相同的,则队列为空

//判断空
bool isEmpty(SqQueue &Q)
{
	if(Q.front == Q.rear)
		return true;
	else
		return false;
}

入队:因为最开始是设置Q.front与Q.rear都为0,每一次入队一个元素之后Q.rear就是指向入队元素后面一个位置,若是整个队满了,这是Q.rear指向最后一个入队元素的后面,这时候Q.rear = 0,而Q.front也为0,这时和队空条件一致,所以无法判断,故留一个队列单元

//入队
bool enQueue(SqQueue &Q, int s)
{
	if(Q.front == (Q.rear+1)%maxsize)
		return false;
	Q.data[Q.rear] = s;
	Q.rear = (Q.rear+1)%maxsize;
	return true;
}

出队

//出队
int DeQueue(SqQueue &Q, int &s)
{
	if(Q.front == Q.rear)
		return 9999;
	s = Q.data[Q.front];
	Q.front = (Q.front+1)%maxsize;
	return s;
}

遍历输出:因为队列是从队头出去,所以最开始令i = Q.front,当其不等于Q.rear时就一个一个的输出,因为入队之后队列的排序就是从队头到队尾,顺序也是从Q.front到Q.rear。故以i !=Q.rear为结束循环条件

//遍历输出
void traverse(SqQueue &Q)
{
	int i = Q.front;
	while(i != Q.rear)
	{
		printf("%d ",Q.data[i]);
		i = (i+1)%maxsize;
	}
}

运行结果:maxsize设置为5,此时结果为4个

2.类型中增设表示元素个数的数据成员,其余的和1是差不多的

(1)队空条件为Q.size = 0

(2)队满条件为Q.size = maxsize

此时这两种情况都为Q.front = Q.rear

初始化

//初始化
void InitQueue(SqQueue &Q)
{
	Q.front = Q.rear = Q.size = 0;//最开始使其全部为0
}

 判断空

//判断空
bool isEmpty(SqQueue &Q)
{
	if(Q.size == 0)//因为其是用来记录队列中元素个数,为0则为空
		return true;
	else
		return false;

}

入队

//入队
bool enQueue(SqQueue &Q,int s)
{
	if(Q.size == maxsize)//加入Q.size目的就是不会浪费队列中的一个单元,当其为maxsize则说明队列已经满了可以结束
		return false;
	else
	{
		Q.data[Q.rear] = s;
		Q.rear = (Q.rear+1)%maxsize;
		Q.size++;
	}
	return true;
}

出队

//出队
int DeQueue(SqQueue &Q, int &s)
{
	if(Q.size == 0)//为0的时候队列为空
		return 9999;
	else
	{
		s = Q.data[Q.front];//用此记录出队的数
		Q.front = (Q.front+1)%maxsize;
		Q.size--;
	}
	return s;
}

遍历输出:注意此时i是如何变换的

//遍历输出
void traverse(SqQueue &Q)
{
	int i = Q.front;//队列是从表头出的
	while(i != maxsize)
	{
		printf("%d ",Q.data[i]);
		i++;//若也是i = (i+1)%maxsize这种格式,就不会出现等于maxsize,会出错。
	}
	printf("\n");
}

运算结果:maxsize设置为5,此时输出结果有5个

1.的完整代码 

#include<stdio.h>
#define maxsize 5

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


//函数说明
void InitQueue(SqQueue &Q);//初始化
bool isEmpty(SqQueue &Q);//判断空
bool enQueue(SqQueue &Q, int s);//入队
int DeQueue(SqQueue &Q, int &s);//出队
void traverse(SqQueue &Q);//遍历输出


int main(void)
{
  SqQueue Q;
  int s,val;
  InitQueue(Q);
  enQueue(Q,1);
  enQueue(Q,2);
  enQueue(Q,3);
  enQueue(Q,4);
  enQueue(Q,5);
  enQueue(Q,6);
  enQueue(Q,7);
  printf("入队之后队列中元素为:");
  traverse(Q);
  val = DeQueue(Q,s);
  printf("出队元素为:%d\n",val);
  printf("出队之后队列中元素为:");
  traverse(Q);
  return 0;
}

//初始化
void InitQueue(SqQueue &Q)
{
	Q.front = Q.rear = 0;
}

//判断空
bool isEmpty(SqQueue &Q)
{
	if(Q.front == Q.rear)
		return true;
	else
		return false;
}

//入队
bool enQueue(SqQueue &Q, int s)
{
	if(Q.front == (Q.rear+1)%maxsize)
		return false;
	Q.data[Q.rear] = s;
	Q.rear = (Q.rear+1)%maxsize;
	return true;
}

//出队
int DeQueue(SqQueue &Q, int &s)
{
	if(Q.front == Q.rear)
		return 9999;
	s = Q.data[Q.front];
	Q.front = (Q.front+1)%maxsize;
	return s;
}

//遍历输出
void traverse(SqQueue &Q)
{
	int i = Q.front;
	while(i != Q.rear)
	{
		printf("%d ",Q.data[i]);
		i = (i+1)%maxsize;
	}
}

2.的完整代码

#include<stdio.h>
#define maxsize 5
typedef struct
{
  int data[maxsize];
  int front,rear;
  int size;//用来表示队列中元素个数
}SqQueue;
//函数说明
void InitQueue(SqQueue &Q);
bool isEmpty(SqQueue &Q);
bool enQueue(SqQueue &Q,int s);
int DeQueue(SqQueue &Q, int &s);
void traverse(SqQueue &Q);
int main(void)
{
  SqQueue Q;
  int val,s;
  InitQueue(Q);
  enQueue(Q,1);
  enQueue(Q,2);
  enQueue(Q,3);
  enQueue(Q,4);
  enQueue(Q,5);
  enQueue(Q,6);
  printf("入队之后队中元素为:\n");
  traverse(Q);
  val = DeQueue(Q,s);
  printf("出队元素为:%d\n",val);
  printf("出队之后队列元素为:\n");
  traverse(Q);
  return 0;
}

//初始化
void InitQueue(SqQueue &Q)
{
	Q.front = Q.rear = Q.size = 0;//最开始使其全部为0
}

//判断空
bool isEmpty(SqQueue &Q)
{
	if(Q.size == 0)//因为其是用来记录队列中元素个数,为0则为空
		return true;
	else
		return false;

}

//入队
bool enQueue(SqQueue &Q,int s)
{
	if(Q.size == maxsize)//加入Q.size目的就是不会浪费队列中的一个单元,当其为maxsize则说明队列已经满了可以结束
		return false;
	else
	{
		Q.data[Q.rear] = s;
		Q.rear = (Q.rear+1)%maxsize;
		Q.size++;
	}
	return true;
}

//出队
int DeQueue(SqQueue &Q, int &s)
{
	if(Q.size == 0)//为0的时候队列为空
		return 9999;
	else
	{
		s = Q.data[Q.front];//用此记录出队的数
		Q.front = (Q.front+1)%maxsize;
		Q.size--;
	}
	return s;
}

//遍历输出
void traverse(SqQueue &Q)
{
	int i = Q.front;//队列是从表头出的
	while(i != maxsize)
	{
		printf("%d ",Q.data[i]);
		i++;//若也是i = (i+1)%maxsize这种格式,就不会出现等于maxsize,会出错。
	}
	printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值