队列

队列是一种先入先出的数据结构

栈需要两个标志位 :
队头标志位 front
队尾标志位 rear

实现方式:
1 通过数组
2 通过链表

顺序队列

内存结构图

通过数组实现:数组元素是有限的,入队和出队要考虑到满和空的情况

另外,需要两个下标front和rear 来标记队列的头尾的位置

循环数组实现方式是 : 下标%数组长度

注意:

1 顺序队列的实际可存入数据大小是 = 数组长度 - 1
2 规定 :front 和 rear 相等时 队列为空
3 规定 :front 的对应位置不存数据 那么队列第一个元素 == ( front+1)%数组长度

1、空顺序队列

数据结构之队列

2、入队列(push)

数据结构之队列

3、出队列 (pop)

数据结构之队列

.h文件

#ifndef _QUEUE_H_
#define _QUEUE_H_


#define  QUEUE_SIZE 10

typedef enum{FALSE,TRUE} BOOL;


typedef int Data;

typedef struct _queue
{
	Data data[QUEUE_SIZE];  //队列大小
	int front;     			//队头
	int rear ;				//队尾
}Queue;


//初始化空队列
void Init_Queue(Queue*q);


//判断满队列
BOOL IsFull(Queue*q);

//入队列
void Push(Queue*q,Data data);

//判断空队列
BOOL IsEmpty(Queue*q);

//出队列
void Pop(Queue*q);


//获取队头元素
Data Gettop(Queue*q);


//打印队列数据
void Display(Queue*q);



#endif//_QUEUE_H_

.c文件

#include "Queue.h"
#include <stdlib.h>
#include <stdio.h>


void Init_Queue(Queue*q)
{
	if(NULL == q)
		return ;
	
	q->front = 0;
	q->rear  = 0;
}


BOOL IsFull(Queue*q)
{
	if(NULL == q)
		return ;
	
	
	if((q->rear+1)%QUEUE_SIZE == q->front)
		return TRUE;
	
	return FALSE;	
}

void Push(Queue*q,Data data)
{
	if(NULL == q)
		return ;
	
	if(IsFull(q) == TRUE)
		return ;
	
	q->rear = (q->rear+1)%QUEUE_SIZE;
	q->data[q->rear]  = data;
	
}


BOOL IsEmpty(Queue*q)
{
	if(NULL == q)
		return ;
	
	
	if(q->front == q->rear)
		return TRUE;
	
	return FALSE;
}

void Pop(Queue*q)
{
	if(NULL == q)
		return ;
	
	if(IsEmpty(q) == TRUE)
		return ;
	
	q->front = (q->front+1)%QUEUE_SIZE;
}


Data Gettop(Queue*q)
{
	if(NULL == q)
		return ;
	
	if(IsEmpty(q) == TRUE)
		exit(-1) ;
	
	return q->data[(q->front+1)%QUEUE_SIZE];
}


void Display(Queue*q)
{
	
	while(!IsEmpty(q))
	{
		
		printf("%d\n",Gettop(q));
		
		Pop(q);	
	}
	printf("顺序队列打印结束并置空队列!!!!\n");
}

链式队列

内存结构图

数据结构之队列

.h文件

#ifndef _QUEUE_H_
#define _QUEUE_H_




typedef enum{FALSE,TRUE} BOOL;


typedef int Data;

typedef struct _node
{
	Data data;            //节点数据
	struct _node *next ;  //指针域  指向下一个节点
}Node;


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


//初始化空队列
void Init_Queue(Queue*q);


//判断空队列
BOOL IsEmpty(Queue*q);


//入队列
void Push(Queue*q,Data data);

//出队列
void Pop(Queue*q);


//获取队头元素
Data GetFront(Queue*q);


//打印队列数据
void Display_Queue(Queue*q);








#endif//_QUEUE_H_

.c文件

#include "Queue.h"
#include <stdlib.h>
#include <stdio.h>


void Init_Queue(Queue*q)
{
	if(NULL == q)
		return ;
	
	q->front = NULL;
	q->rear  = NULL;
}

BOOL IsEmpty(Queue*q)
{
	if(NULL == q)
		return ;
	
	
	if(NULL == q->front)
		return TRUE;
	
	return FALSE;
}

void Push(Queue*q,Data data)
{
	if(NULL == q)
		return ;
	
	Node *new_node =(Node*)malloc(sizeof(Node)/sizeof(char));
	if(NULL == new_node)
	{
		return ;
	}
	
	new_node->data = data;
	new_node->next = NULL;

	
	if(!IsEmpty(q))//非空队列
	{
		q->rear ->next = new_node;
		q->rear        = new_node;
	}
	else//空队列
	{
		q->front = new_node;
		q->rear  = new_node;
	}	
}


void Pop(Queue*q)
{
	if(NULL == q)
		return ;
	
	if(IsEmpty(q) == TRUE)
		return ;
	
	Node *tmp = q->front;
	if(q->front->next != NULL)//队列 > 1个节点
	{
		q->front     = tmp->next;
	}
	else//队列 = 1个节点
	{	
		q->front  = NULL;
		q->rear   = NULL;
	}	
	
	free(tmp);
}


Data GetFront(Queue*q)
{
	if(NULL == q)
		return ;
	
	if(IsEmpty(q) == TRUE)
		exit(-1) ;
	
	return q->front->data;
}


void Display_Queue(Queue*q)
{
	
	while(!IsEmpty(q))
	{
		
		printf("%-4d",GetFront(q));
		
		Pop(q);	
	}
	
	printf("\n");
	printf("队列打印结束并置空栈!!!!\n");
}













相关文章: