循环列队的循序结构

</pre><pre name="code" class="cpp">//1.队列顺序结构的定义

#define MAXQSIZE 100
typedef struct 
{
	QElemType base[MAXQSIZE];//静态数组
	int front;//队列头指针
	int rear;//队列尾指针
}SqQueue;

//解决队列的假溢出方法
//1.将循序列队臆造为一个环状空间。尾指针指向头指针
//2.在对满的情况下,rear指针和front指针会指向同一个节点元素。
//这时候就相当于对空,因为队列为空的情况下,rear和front指针指向同一元素

//循环队列怎么区分对空和对满呢???
//解决办法;

//1.因出对而相等,则为空。因入队而相等,则为满
//2.少用一个元素的空间,约定rear+1=front时,就认为对满


//2.循环队列,队列顺序存储结构的虚拟实现

#define MAXQSIZE 100//最大列队长度
typedef struct 
{
	QElemType *base;//初始化的动态分配存储空间
	int front;//头指针,若对不空,指向队列头元素
	int rear;//尾指针,若队列不空,指向队尾元素的下一位置
}SqQueue;

//3.基本操作

Status InitQueue(SqQueue &Q)
{
	//构造一个空队列Q
	Q.base=(QElemType*)malloc(//开辟队列的内存空间
		MAXQSIZE*sizeof(QElemType));
	if(!Q.base)//如果队尾不存在,那么开辟空间失败
		exit(OVERFLOW);
	Q.front=Q.rear=0;//空队列
	return OK;
}


//4.求队列长度

int QueueLength (SqQueue Q)
{//返回Q的元素个数,即队列的长度
	return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
	//由于rear也可能小于front,所以这个方法比较实用,相当于求
	//rear-front的绝对值。
}

//5.插入元素E为Qde 新队尾元素

Status EnQueue(SqQueue &Q,QElemType e)
{
	if((Q.rear+1)%MAXQSIZE==Q.front)//判断是否为对满
		return ERROR;
	Q.base[Q.rear]=e;//让新插入的元素为队尾元素
	Q.rear=(Q.rear+1)%MAXQSIZE;//移动到下一位,如果对满,那么取余到达第一元素位置
	return OK;
}

//6.入队和出队
//入队:rear=rear+1;入队队尾元素加一a4->a5->a6;一次增加
//出队:front=front+1  出队时队首元素加一a4->a3->a2->a1,从右到左出队

//7.若队不空,则删除队头元素,用e返回其值,否则,返回ERROR

Status DeQueue(SqQueue &Q,QElemType &e)
{
	if(Q.front==Q.rear)//如果队列为空,返回ERROR
		return ERROR;
		e=Q.base[Q.front];//把队首指针赋给e
	Q.front=(Q.front+1)%MAXQSIZE;//将队首指针向上移动一个位置
	//如果队满,则循环到第一个位置
	return OK;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章