大话数据结构——队列

队列(Queue):只允许在一端进行插入操作,而在另一端进行删除操作的线性表。(FIFO结构)

队列的抽象数据类型:

ADT 队列 (Queue)
Data
Operation
    InitQueue(*Q) :初始化操作,建立一个空队列Q。
    DestroyQueue(*Q) :若队列Q存在,则销毁它。
    ClearQueue(*Q) :将队列Q清空。
    QueueEmpty(Q) :若队列Q为空,返回true,否则返回false。
    GetHead(Q,*e) :若队列Q存在且非空,用e返回队列Q的队头元素。
    EnQueue(*Q,e) :若队列Q存在,插入新元素e到队列Q中并成为对尾元素 。
    DeQueue(*Q,*e) :删除队列Q中队头元素,并用e返回其值。
    QueueLength(Q) :返回队列Q的元素个数
endADT

循环队列:

为了解决假溢出,把队列头尾相接的顺序存储结构。

typedef int QElemType;

typedef struct
{	

    QElemType data[MAXSIZE];	    
	int front;                 //头指针
    int rear;                  //尾指针

}SqQueue;

队列的链式存储结构:

typedef int QElemType;

typedef struct QNode
{
	QElemType data;
	struct QNode *next;
}QNode, *QueuePtr;

typedef struct 
{	

  	 QueuePtr front, rear;        /* 队头、队尾指针 */

}LinkQueue;

入队操作:

Status EnQueue(LinkQueue *Q, QElemType e)
{	
	QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
	if(!s)
		exit(OVERFLOW);
	s->data=e;
	s->next=NULL;
	Q->rear->next=s;
	Q->rear=s;
	return OK;

}

出队操作:

Status DeQueue(LinkQueue *Q, QElemType e)
{	
	QueuePtr p;
	if(Q->front==Q->rear)
		return ERROR;
	p=Q->front->next;
	*e=p->data;
	Q->front->next=p->next;
	
	if(Q->rear==p)
		Q->rear=Q->front;
	free(p);
	return OK;

}

你可能感兴趣的:(数据结构与算法)