数据结构(C语言版) 栈和队列 算法设计Demo6

Posted Aiden (winner)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版) 栈和队列 算法设计Demo6相关的知识,希望对你有一定的参考价值。

假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素站点(注意不设头指针) ,试编写相应的置空队、判队空 、入队和出队等算法。

[题目分析]

置空队就是建立一个头节点,并把头尾指针都指向头节点,头节点是不存放数据的;判队空就是当头指针等于尾指针时,队空;入队时,将新的节点插入到链队列的尾部,同时将尾指针指向这个节点;出队时,删除的是队头节点,要注意队列的长度大于1还是等于1的情况,这个时候要注意尾指针的修改,如果等于1,则要删除尾指针指向的节点。

[算法描述]

//先定义链队结构:
typedef struct queuenode
	Datatype data;
	struct queuenode *next;
QueueNode; //以上是结点类型的定义
typedef struct
	queuenode *rear;
LinkQueue; //只设一个指向队尾元素的指针

//(1) 置空队
void InitQueue( LinkQueue *Q)
//置空队:就是使头结点成为队尾元素
	QueueNode *s;
	Q->rear = Q->rear->next;//将队尾指针指向头结点
	while(Q->rear!=Q->rear->next)//当队列非空,将队中元素逐个出队
		s=Q->rear->next;
		Q->rear->next=s->next;
		delete s;
	//回收结点空间


//(2) 判队空 
int EmptyQueue( LinkQueue *Q)
 //判队空。当头结点的next指针指向自己时为空队
 return Q->rear->next->next==Q->rear->next;


//(3) 入队
void EnQueue( LinkQueue *Q, Datatype x)
//入队。也就是在尾结点处插入元素
	QueueNode *p=new QueueNode;//申请新结点
	p->data=x; 
	p->next=Q->rear->next;//初始化新结点并链入
	Q-rear->next=p; 
	Q->rear=p;//将尾指针移至新结点


//(4) 出队
Datatype DeQueue( LinkQueue *Q)
//出队,把头结点之后的元素摘下
Datatype t;
QueueNode *p;
	if(EmptyQueue( Q ))
		Error("Queue underflow");
	p=Q->rear->next->next; //p指向将要摘下的结点
	x=p->data; //保存结点中数据
	if (p==Q->rear)
	//当队列中只有一个结点时,p结点出队后,要将队尾指针指向头结点
 		Q->rear = Q->rear->next; 
		Q->rear->next=p->next;
	else 
		Q->rear->next->next=p->next;//摘下结点p
	delete p;//释放被删结点
	return x;


以上是关于数据结构(C语言版) 栈和队列 算法设计Demo6的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版) 栈和队列 算法设计Demo14

数据结构(C语言版) 栈和队列 算法设计Demo9

数据结构(C语言版) 栈和队列 算法设计Demo8

数据结构(C语言版) 栈和队列 算法设计Demo13

数据结构(C语言版) 栈和队列 算法设计Demo10

数据结构(C语言版) 栈和队列 算法设计Demo12