数据结构----队列的操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wanglele1/article/details/79180465

队列的定义:队列简称队,它是一种运算受控的线性表,其限制为仅允许在标的一段进行插入,在表的另一端进行删除。可进行插入的是队尾,可进行删除的是队头 队列中插入元素称为进队,新元素进队后称为新的队尾元素,从队列中删除元素称为出队,元素出队后,其后继元素成为新的队头元素。

队列的特点:先进先出(FIFO

队列的存储结构:顺序队链队

一,顺序队

 队列的顺序存储结构表示:

#define maxsize 100 //队列可能达到的最大长度
typedef struct
{  
    int data[maxsize];  
    int front; //队首指针  
    int rear; //队尾指针  
}SqQueue;  

1,循环队列的初始化

循环队列的初始化操作就是动态分配一个大小为maxsize的数组空间

①为队列分配一个最大容量为maxsize的数组空间,base指向数组空间的首地址

②头指针和尾指针置零,表示队列为空

【算法描述】

status InitQueue(SqQueue &q)
{//构造一个空队列Q
	Q.base=new	QElemeType[maxsize];	//	为队列分配一个最大容量为maxsize的数组空间
	if(!Q.base)	exit(overflow);		//存储分配失败
	Q.front=Q.rear=0;		//头指针和尾指针置零
	return ok;
}

2,求循环队列的长度

【算法描述】

int QueueLength(SqQueue q)
{//返回Q的元素个数,即队列的长度
	return(Q.rear-Q.front+maxsize)%maxsize;
}

3,入队

【算法描述】

status EnQueu(SqQueue &Q,QElemType)
{//插入元素为Q的新的队列元素
	if((Q.rear+1)%maxsize==q.front)
		return error;
	Q.base[Q.rear]=e;	//新元素插入队尾
	Q.rear=(q.rear+1)%maxsize	//队尾指针加1
	return ok;
}
4,出队

【算法描述】

status DeQueu(SqQueue &Q,QElemType)
{//插入元素为Q的新的队列元素
	if(Q.front==Q.rear)	//队空
		return error;
	Q.base[Q.front]=e;	//新元素插入队尾
	Q.front=(q.front+1)%maxsize	//队尾指针加1
	return ok;
}
5,取循环队列的队头元素

SElemType GetHead(Squeue Q)
{//返回Q的队头元素,不修改队头指针
	if(Q.rear==Q.front)		//队列不为空
		return Q.base[Q.front];		//返回队头元素的值,队头指针不变
}

二,循环队列的实现

#include<stdio.h>  
#include<stdlib.h>  
#define maxsize 50  
typedef struct SqQueue{  
    int data[maxsize];  
    int front;//队首指针  
    int rear;//队尾指针  
}SqQueue;  
//创建循环队列  
SqQueue initQueue(){  
    SqQueue *sq=(SqQueue *)malloc(sizeof(SqQueue));  
    sq->rear=sq->front=0;  
    return *sq;  
}  
//判断循环队列是否为空  
int isEmpty(SqQueue qu){  
    return (qu.front ==qu.rear?1:0);  
}  
//元素进循环队列  
int enQueue(SqQueue *qu,int x){  
    if((qu->rear+1)%maxsize ==qu->front){  
        return 0;  
    }  
    qu->rear=(qu->rear+1)%maxsize;  
    qu->data[qu->rear]=x;  
    return 1;  
}  
//元素出循环队列  
int deQueue(SqQueue *qu,int *y){  
    if(qu->rear ==qu->front){  
        return 0;  
    }  
    *y=qu->data[qu->front];  
    qu->front=(qu->front+1)%maxsize;  
    return 1;  
}  
//打印循环队列  
int printQueue(SqQueue qu){  
    if(qu.rear ==qu.front){  
        return 0;  
    }  
    while(qu.rear !=qu.front){  
        qu.front=(qu.front+1)%maxsize;  
        printf("当前队列值=%d\n",qu.data[qu.front]);  
    }  
    return 1;  
}  
void main(){  
    int y=0;  
    SqQueue sq =initQueue();  
    enQueue(&sq,1);  
    enQueue(&sq,2);  
    enQueue(&sq,3);  
    enQueue(&sq,4);  
    deQueue(&sq,&y);  
    printQueue(sq);  
    printf("当前的front=%d\n",sq.front);  
    printf("当前的rear=%d\n",sq.rear);  
      
}  




猜你喜欢

转载自blog.csdn.net/wanglele1/article/details/79180465