数据结构(线性表篇)---------队列 实现初始化,队列判空,出入队

队列,先进先出,本质上是将存取点限制在头尾的线性表(尾进头出),构如其名,就像平常排队先排队的先享受服务。顺序队列(顺序表实现的队列),特别是循环队列,主要难点在于出入队后,队头队尾指针如何变化,设maxSize为队列中最大元素个数。

  1. 无论何种形式,队空标志一定是队头指针== 队尾指针。
  2. 入队队尾巴指针:q.rear = (q.rear + 1) % maxSize
  3. 出队队头指针:q.front = (q.front + 1 )% maxSize;
  4. 判断队长:q.length = (q.rear +maxSize - q.front)%maxSize;

以下为链队列的实现,定义了一个结点的结构体和一个队列的结构体;其中结点包括 指向下一个结点的指针,队列包括头、尾指针。 这样的定义(即定义结点的结构体,也定义链表的结构体)也可以运用到单链表中,通过这种可以把链表当做一个整体进行操作,而不是一堆连起来的结点。

#include
#include
#define true 1
#define false 0

typedef struct _node {
	int value;
	struct _node* next;
} Node;

typedef struct _queue {
	Node *front;
	Node *rear;
} Queue;

void Print(Queue* queue);//打印队列
Queue* InitQueue(Queue* queue);//初始化队列;
int IsEmpty(Queue* queue);//链表判空
void EnQueue(Queue* queue, int x);//入队
int DeQueue(Queue* queue, int* x);//出队
int main() {
	int x;
	Queue* queue = (Queue*)malloc(sizeof(Queue));//指向队列的指针;
	InitQueue(queue);
	if(IsEmpty(queue))
		printf("The queue is empty.\n");
	EnQueue(queue,3);
	Print(queue);
	if(	DeQueue(queue,&x) )
		printf("%d\n",x);

	Print(queue);
}

Queue* InitQueue(Queue* queue) {
	queue->front = queue->rear = (Node*)malloc(sizeof(Node));//初始化这个队列的头尾结点。
	queue->front->next = NULL;//队列置空
	return queue;
}

int IsEmpty(Queue* queue) {
	if(queue->front == queue->rear)
		return true;
	else
		return false;
}

void EnQueue(Queue* queue, int x) {
	Node *p = (Node*)malloc(sizeof(Node));//定义一个新结点
	p->value = x;
	p->next = NULL;
	queue->rear->next = p;//新结点放到尾指针的下一个位置
	queue->rear = p;//尾指针指向新结点
}

int DeQueue(Queue* queue, int* x) {
	if(IsEmpty(queue))//空队列出队失败
		return false;
	Node* p = queue->front->next;
	*x = p->value;
	queue->front->next = p->next;//队列头指针指向下一个结点
	if(queue->rear = p)//队列只有一个元素时,元素出队,队列置空。
		queue->rear = queue->front;
	return true;
}

void Print(Queue* queue) {
	Node* p = queue->front->next;
	if(!IsEmpty(queue)) {
		while(p != NULL) {
			printf("%d ",p->value);
			p = p->next;
		}
	} else {
		printf("Fail to print");
	}
	printf("\n");
}

你可能感兴趣的:(数据结构,c语言,算法,数据结构)