队列的实现

一、队列是什么

    队列是一种可以实现“先进先出”的存储结构。其实,说简单点,队列就是排队,跟我们日常生活中到银行取钱排队,排队打饭在道理上是一样的。

    队列通常可以分为两种类型:
       ①链式队列(由链表实现)。
       ②静态队列(由数组实现),静态队列通常都必须是循环队列。
    由于链式队列跟链表差不多,所以在这里只针对循环队列来说明并实践。
    循环队列的两个参数:
       ①front,front指向队列的第一个元素。
       ②rear,rear指向队列的最后一个有效元素的下一元素。
    队列的两个基本操作:出队和入队。

二、队列的结构

    下面是一个循环队列(基于数组实现)的结构图:

    

三、队列的操作

      入队(尾部入队) 
            ①将值存入rear所代表的位置。
            ②rear = (rear+1)%数组的长度。
      出队(头部出队) 
            front = (front+1)%数组的长度。
      队列是否为空   
            front和rear的值相等,则该队列就一定为空。
      队列是否已满
            注意:循环队列中,有n个位置,通常放n-1个值,空1个
                    在循环队列中,front和rear指向的值不相关,无规律。front可能比rear指向的值大,也可能比rear指向的值小,也可能两者相等。
            算法:
            ①多增加一个标识参数。
            ②少用一个元素,rear和front指向的值紧挨着,则队列已满。

 

四、队列的实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct student_grade
{
  char  name[20];
  char	score;
} Student;
#define 	QueueLen  10
//Student  	StudentBuf[QueueLen]={0};
/*
char rear=0;
char front=0;
*/
#define	Fail   		1
#define Success   	0

#define	true   		1
#define false   	0
#define			ToString(a)  #a

typedef struct Queue  
{  
   	Student * 	pBase;    	//用于动态分配内存,pBase保存数组的首地址  
    int 		front;      //头结点  
    int 		rear;       //下一个队列节点
    int         len;		//队列长度
} QUEUE; 
QUEUE  queue;
char IS_Empty(void)
{
 	if(queue.rear==queue.front)
 	{

		printf("queue is empty\n");
 		return true;
 	}
	else
	{
		return	false;
	}
}

char IS_Full(void)
{
	/***
	加一是为了避免初始化的时候, front和rear都为0,计算出
	队列为满,但是少存储个队列。
	***/
 	if((queue.rear+1)%QueueLen==queue.front)
 	{
 		printf("queue is full\n");
 		return true;
 	}
	else
	{
		return	false;
	}
}

char inQueue(Student *value)
{
	if(IS_Full()==true)
	{
		return	Fail;
	}

	memcpy(queue.pBase[queue.rear].name,  value->name,20);
	queue.pBase[queue.rear].score=value->score;
	queue.rear=(queue.rear+1)%QueueLen;
	//printf("rear=%d\n",queue.rear);
	return	Success;
}

char outQueue(Student *value)
{
	if(IS_Empty()==true)
	{
		return	Fail;
	}

	memcpy(value->name,queue.pBase[queue.front].name,20);
	value->score=queue.pBase[queue.front].score;
	queue.front=(queue.front+1)%QueueLen;

	//printf("front=%d\n",queue.front);
	return	Success;
}
void initQueue(QUEUE * pQueue)  
{  
    //分配内存  
    pQueue->pBase = (Student *)malloc(sizeof(Student)*QueueLen);
    pQueue->front = 0;
    pQueue->rear = 0;  
	pQueue->len = QueueLen;  
    return;  
} 
void deinitQueue(QUEUE * pQueue)
{
   free(pQueue->pBase);
}

int main(void) 
{
	int i=0;
	
	Student		newstudent={0,0};
	initQueue(&queue);

	for(i=0;i<queue.len;i++)
	{
		sprintf(newstudent.name,"%c",'a'+i);
		newstudent.name[1]=0;
		newstudent.score=i;		
		/*
		名字和分数依次是 	a 0
							b 1
							c 2
							d 3
		*/
		printf("-%s- ",newstudent.name);
		if(inQueue(&newstudent)==Fail)
		{
			break;
		} 
		
	}
	printf("\n----\n");

	for(i=0;i<queue.len;i++)
	{
		if(outQueue(&newstudent)==Fail)
		{
			break;
		} 
		else
		{
			printf("[--%s-%d-] ",newstudent.name,newstudent.score);
		}
		
	}
	printf("\n----\n");

	deinitQueue(&queue);

	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值