自主编程实现数组队列和链式队列

本文介绍了队列这一数据结构的概念及特点,包括入队、出队等基本操作,并提供了数组队列和链式队列的具体实现代码。
    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
    队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表

下面是编程实现的数组队列:
#include <stdio.h>

#define Queue_Size    100
#define OK            0
#define ERROR         -1

typedef int dataType ;
typedef struct
{
    dataType data[Queue_Size] ;
	int rear ;    //后
	int front ;   //前
}SeqQueue ;


//置空队列
int InitQueue(SeqQueue * queue)
{
    if(queue == NULL)
	{
		return ERROR ;
	}		
	queue->rear = 0 ;
	queue->front = 0 ;
	
	return OK ;
}

//判断是否为空队
int QueueEmpty(SeqQueue *queue)
{
	if(queue == NULL)
	{
		return ERROR ;
	}
	
	return queue->rear == queue->front ;
}

//判断是否满队
int QueueFull(SeqQueue * queue)
{
	if(queue == NULL)
	{
		return ERROR ;
	}
	
	return (queue->rear+1)%Queue_Size == queue->front ;    //满队返回1,否则返回0
}


//数据入队
int Queue_in(SeqQueue * queue,int mydata)
{
	if(queue == NULL)
	{
		return ERROR ;
	}
	if(QueueFull(queue) == 1)
	{
		return 	ERROR ; 
	}
	
	queue->rear = (queue->rear+1)%Queue_Size ;
	queue->data[queue->rear] = mydata ;	
	
}


//数据出队
int Queue_out(SeqQueue * queue)
{
	if(queue == NULL)
	{
		return ERROR ;
	}
	
	if(QueueEmpty(queue) == 1)
	{
		return ERROR ;
	}
	
	queue->front = (queue->front+1)%Queue_Size ;
	
	return queue->data[queue->front] ;
}

//获取队头元素
int GetFront(SeqQueue *queue)
{
	if(queue == NULL)
	{
		return ERROR ;
	}
	
	if(QueueEmpty(queue) == 1)
	{
		return ERROR ;
	}
	
	int nPos = (queue->front+1)%Queue_Size ;
	
	return queue->data[nPos] ;
}



int  main()
{
	SeqQueue queue ;
	if(InitQueue(&queue) != OK)
	{
		return -1 ;
	}
	
	if(QueueEmpty(&queue) == 1)
	{
		printf("空队列\n") ;
	}
	else
	{
		printf("不是空队列\n") ;
	}
	int i ;
	for(i=0;i<10;i++)
	{
		Queue_in(&queue,i);
	}
	
	if(QueueEmpty(&queue))
	{
		printf("空队列\n") ;
	}
	else
	{
		printf("不是空队列\n") ;
	}
	
	for(i=0;i<10;i++)
	{
		printf("%4d",Queue_out(&queue));
	}
	
	if(QueueEmpty(&queue))
	{
		printf("空队列\n") ;
	}
	else
	{
		printf("不是空队列\n") ;
	}
	
	return 0 ;
}


 编程实现的链式队列:
#include <stdio.h>
#include <stdlib.h>

#define    OK               0
#define    ERROR           -1
#define     MALLOC_ERROR   -2

typedef int dataType ;

typedef struct node 
{
	dataType data ;      //队列节点数据
	struct node *next ;  //节点指针
}Node ;

typedef Node *pNode ;

typedef struct
{
	pNode rear  ;   //队尾指针
	PNode front ;   //队头指针
}LinkQueue ;

//初始化队列
int InitQueue(LinkQueue *queue)
{
	if(queue == NULL)
	{
		return ERROR ;
	}
	
	queue->front = NULL ;
	queue->rear = NULL ;
	
	return OK ;
} 

//判断是否为空队列
int QueueEmpty(LinkQueue * queue)
{
	if(queue == NULL)
	{
		return ERROR ;
	}
	return (queue->front == NULL) ;
}

//数据入队
int Queue_in(LinkQueue *queue ,int nData)
{
	if(queue == NULL)
	{
		return ERROR ;
	}
	pNode node = (pNode)malloc(sizeof(Node)/sizeof(char)) ;
	if(node == NULL)
	{
		return MALLOC_ERROR ;
	}
	node->data = nData ;
	node->next = NULL ;
	
	if(QueueEmpty(queue))
	{
		queue->front = node ;
		queue->rear = node ;
	}
	else
	{
		queue->rear->next = node ;
		queue->rear = node ;
	}
	
	return OK ;
}


//数据出队
int Queue_out(LinkQueue * queue)
{
	if(queue == NULL)
	{
		return ERROR ;
	}
	
	if(QueueEmpty(queue) == 1)
	{
		return ERROR ;
	}
	
	pNode p = queue->front ;
	int nData = p->data ;
	queue->front = p->next ;
	
	if(queue->front == NULL)
	{
		queue->rear == NULL ;
	}
	
	return nData ;
}


int main()
{
	SeqQueue queue ;
	if(InitQueue(&queue) != OK)
	{
		return -1 ;
	}
	
	if(QueueEmpty(&queue) == 1)
	{
		printf("空队列\n") ;
	}
	else
	{
		printf("不是空队列\n") ;
	}
	int i ;
	for(i=0;i<10;i++)
	{
		Queue_in(&queue,i);
	}
	
	if(QueueEmpty(&queue))
	{
		printf("空队列\n") ;
	}
	else
	{
		printf("不是空队列\n") ;
	}
	
	for(i=0;i<10;i++)
	{
		printf("%4d",Queue_out(&queue));
	}
	
	if(QueueEmpty(&queue))
	{
		printf("空队列\n") ;
	}
	else
	{
		printf("不是空队列\n") ;
	}
	
	return 0 ;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值