数据结构学习之队列

         队列是一种先进先出(FIFO)的结构,他只允许在表的一头进行插入(队头),在另一头删除元素(队尾)。而队列又分为线形队列和环形队列,下面首先介绍线性队列的C语言实现。

         现行队列的基本架构:


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>  //使用bool必须包含此文件 

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

#define QUEUE_CAPACITY  3  //队列容量 
typedef struct tag_queue
{
	int *pQueue;   //队列内存指针 
	int head;
	int tail;
	int length;
}LineQueue;

bool InitQueue(LineQueue **myQueue);
void DestroyQueue(LineQueue *myQueue);
void ClearQueue(LineQueue *myQueue);  //清空队列
bool QueueEmpty(LineQueue *myQueue);  
bool QueueFull(LineQueue *myQueue);
int QueueLength(LineQueue *myQueue);
bool EnQueue(LineQueue *myQueue,int elem);//入队
bool DeQueue(LineQueue *myQueue,int *elem);//出队
void QueueTraverse(LineQueue *myQueue,int flag); //遍历,第二个参数为遍历方式

bool InitQueue(LineQueue **myQueue)//想想为什么要用二级指针?
{
	*myQueue=(LineQueue*)malloc(sizeof(LineQueue));
	if(*myQueue==NULL)
	{
		return false;
	}
	(*myQueue)->pQueue=(int *)malloc(sizeof(int)*QUEUE_CAPACITY);	
	if((*myQueue)->pQueue==NULL)
	{
		return false;
	}
	(*myQueue)->head=0;
	(*myQueue)->tail=0;
	(*myQueue)->length=0;
	return true;
}

void DestroyQueue(LineQueue *myQueue)
{
	free(myQueue->pQueue);
	myQueue->pQueue=NULL;
	free(myQueue);
	myQueue=NULL;
}

void ClearQueue(LineQueue *myQueue)
{
	myQueue->length=0;
	myQueue->tail=0;
}

bool QueueEmpty(LineQueue *myQueue)
{
	if(myQueue->length==0)
	{
		return true;
	}
	return false;
}

bool QueueFull(LineQueue *myQueue)
{
	if(myQueue->length==QUEUE_CAPACITY)
	{
		return true;
	}
	return false;
}

int QueueLength(LineQueue *myQueue)
{
	return  myQueue->length;
}


bool EnQueue(LineQueue *myQueue,int elem)
{
	if(QueueFull(myQueue))
	{
		return false;
	}
  	myQueue->pQueue[myQueue->tail]=elem;
  	myQueue->tail++;
  	myQueue->length++;
  	return true;
}

bool DeQueue(LineQueue *myQueue,int *elem)
{
	int i;
	if(QueueEmpty(myQueue))
	{
		return false;
	}
	*elem=myQueue->pQueue[myQueue->head];//第一个元素
	for(i=0;i<myQueue->length-1;i++)
	{
		myQueue->pQueue[i-1]=myQueue->pQueue[i];//后一个元素前移
	}
	myQueue->length--;
	myQueue->tail--;
	return true;
}

void QueueTraverse(LineQueue *myQueue,int flag)
{
	int i;
	if(flag==0) //从头到尾 
	{
	   for(i=0;i<myQueue->length-1;i++)	
	   {
	   	printf("%d\n",myQueue->pQueue[i]);
	   }
	}
	if(flag==1)//从尾到头 
	{
		for(i=myQueue->length-1;i>=0;i--)
		{
			printf("%d\n",myQueue->pQueue[i]);
		}
	}
}

int main(int argc, char *argv[])
 {
    LineQueue *queue=NULL;
	 InitQueue(&queue);
	 if(QueueEmpty(queue))
	 {
	 	printf("\n队列为空");
	 }
	 printf("\n%p",queue); 
	   EnQueue(queue,1);
     EnQueue(queue,2);
     EnQueue(queue,3);
     
     if(QueueFull(queue))
	 {
	 	printf("\n队列为满\n");
	 }
	 printf("QueueLength=  %d\n",queue->length); 
	 QueueTraverse(queue,1); //从尾到头遍历
	 int elem=0;
	 DeQueue(queue,&elem);  //出队 
	 printf("\nelem=  %d\n",elem); 
	 DeQueue(queue,&elem);  //出队 
	 printf("\nelem=  %d\n",elem); 
	 DeQueue(queue,&elem);  //出队 
	 printf("\nelem=  %d\n",elem); 
	 if(QueueEmpty(queue))
	 {
	 	printf("\n队列为空");
	 }
	DestroyQueue(queue); 
	return 0;
}

                运行结果如下:





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值