数据结构之队列

一、定义

    队列也叫FIFO(first in first out),队列是一种常用的数据结构其特性和栈恰好相反,它是先进先出的,

    关于它的两个重要操作为入队和出队,其只能在头部和尾部进行操作,而其中能在头部尾部进行入队,出

    队操作的为双端队列。

二、使用

    在这里我还是用链式存储结构对一般队列进行实现,并实现其主要API。

typedef  int SeqType;

typedef struct Node//定义数据节点 
{
	SeqType data;
	struct Node *next;	
}Node;

typedef struct Header//定义头节点 
{
	int Length;
	Node *front;//队头指针
	Node *rear;//队尾指针 
}Header;

Header *Creat_Queue()//创建队列 
{
	Header *header = NULL;
	header = (Header*)malloc(sizeof(Header));
	header->Length = 0;
	header->front = NULL;
	header->rear = NULL;
	return header;
}

bool Push_Queue(Header *header,Node *node)//从队尾入队 
{
	if(header->Length == 0)
	{
		header->front = node;
		header->rear= node;
		node->next = NULL;
		header->Length ++;
		return true;
	}
	else
	{
		node->next = NULL;
		header->rear->next=node;
		header->rear = node;
		header->Length ++; 
		return true;
	}
}
bool Pop_Queue(Header *header)//从队头出队 
{
	Node *tem = NULL;
	if(header->Length == 0)
	{
		printf("该队列为空不能进行出队操作");
		return true; 
	}
	else
	{
		tem = header->front;
		header->front = header->front->next; 
		free(tem);
		header->Length--;
		return true;
	}

}
bool Destory_Queue(Header *header)
{
	Node *tem =NULL;
	Node *current = NULL;
	if(header->Length == 0)
	{
		printf("该队列没有元素,无需摧毁\n");
		return true;	
	}	
	current = (Node *)header->front;
	while(current)
	{
		tem = current ;
		current = current->next ;
		free(tem);
		header->Length --;
	}
	return true ;
} 
int main()
{
	Header *header = NULL;
	header = Creat_Queue();
	Node *a = (Node *)malloc(sizeof(Node));
	a->data = 1;
	Node *b = (Node *)malloc(sizeof(Node));
	b->data = 2;
	Node *c = (Node *)malloc(sizeof(Node));
	c->data = 3;
	
	Push_Queue(header,a);//入队操作 
	printf("队头为:%d ",header->front->data);
	printf("队尾为:%d\n",header->rear->data);
	Push_Queue(header,b);
	printf("队头为:%d ",header->front->data);
	printf("队尾为:%d\n",header->rear->data);
	Push_Queue(header,c);
	printf("队头为:%d ",header->front->data);
	printf("队尾为:%d\n",header->rear->data);
	printf("队的长度为:%d",header->Length); 
	//入队操作队头是在不变化而队尾在变化
	printf("开始执行出队操作\n"); 
	Pop_Queue(header);
	printf("队头为:%d ",header->front->data);
	printf("队尾为:%d\n",header->rear->data);
	printf("队的长度为:%d\n",header->Length); 
	//出队操作队尾发生了变化而队头未变
	Destory_Queue(header);
	printf("%d\n",header->Length);
	Destory_Queue(header);//已经被摧毁无需摧毁操作	
}

一定注意到时队头出队,队尾入队(当然这是对单链表存储结构说的)。

欢迎各位指出不足之处

猜你喜欢

转载自blog.csdn.net/qq_41003024/article/details/80276119