1. 程式人生 > >資料結構順序佇列的各種操作

資料結構順序佇列的各種操作

/**  
    標頭檔案stu.h  
    @jeasn168  
*/    
#include<stdio.h>    
#include<string.h>    
#define MaxS 50    
typedef struct    
{    
    char name[MaxS];    
    char stuno[MaxS];    
    float score;    
}stu;    
//輸出stu    
void DispStu(const stu &s)    
{    
    printf("Name:%s\n",s.name);    
    printf("StuNo:%s\n",s.stuno);    
    printf("Score:%f\n",s.score);    
}    
     
     
//比較stu型別    
int isEqual(const stu &a,const stu &b)    
{    
    if(strcmp(a.name,b.name)==0&&strcmp(a.stuno,b.stuno)==0&&a.score==b.score)    
        return 1;    
    else    
        return 0;    
}    
     
  
/**
	順序佇列SqQueue.cpp
	隊尾插入,隊首刪除
	@jeasn168
*/
#include<stdio.h>
#include<malloc.h>
#include"stu.h"
#define MaxSize 5//對的最大長度+1
typedef stu ElemType;
//定義順序佇列結構
typedef struct
{
	ElemType data[MaxSize];
	int front;
	int rear;
}SqQueue;

//初始化
void InitQueue(SqQueue *&q)
{
	q=(SqQueue *)malloc(sizeof(SqQueue));
	q->front=q->rear=0;
}

//銷燬佇列
void DestroyQueue(SqQueue *&q)
{
	free(q);
	printf("銷燬佇列!\n");
}

//判斷對是否為空
int QueueEmpty(SqQueue *q)
{
	return(q->front==q->rear);
}

//判斷對是否已滿
int QueueFull(SqQueue *q)
{
	return((q->rear+1)%MaxSize==q->front);
}

//求佇列長度
int QueueLength(SqQueue *q)
{
	int len=q->rear-q->front;
	return(len>0?len:MaxSize+len);
}
//入隊,從隊尾入隊,食堂排隊打飯
int enQueue(SqQueue *&q,const ElemType &e)
{
	if(QueueFull(q))
	{
		printf("隊滿!\n");
		return 0;
	}
	q->rear=(q->rear+1)%MaxSize;
	q->data[q->rear]=e;
	return 1;

}

//出隊,從隊首出隊
int deQueue(SqQueue *&q,ElemType &e)
{
	if(QueueEmpty(q))
	{
		printf("隊已空!\n");
		return 0;
	}
	q->front=(q->front+1)%MaxSize;//q->front指向未知量,q->front+1才是佇列的第一個元素!,出隊的元素還在陣列中。
	e=q->data[q->front];
	//q->front++;
	return 1;
}

//輸出佇列元素,從隊首到隊尾
void DispQueue(SqQueue *q)
{
	int i,j;
	if(q->front<q->rear)
	{
		//隊首比隊尾小
		for(i=q->front+1;i<=q->rear;i++)
		{
			DispStu(q->data[i]);
			printf("\n");
		}

	}
	else
	{
		//對首比隊尾大
		for(i=q->front+1;i<q->front+QueueLength(q)-q->rear;i++)
		{
			DispStu(q->data[i]);
			printf("\n");
		}
	//	printf("q->data[i]=:\n");
	//	DispStu(q->data[i-1]);
		printf("#######從陣列頭部開始############\n");
		for(j=0;j<=q->rear;j++)
		{
			DispStu(q->data[j]);
			printf("\n");
		}
	}
	
	

}
int main()
{
	stu student[5]={{"Li","S12101",85},{"Liu","S12102",92.5},{"Wang","S12103",54},{"Huang","S12104",76},{"John","S12105",78}};
	stu st1={"LiLy","S12108",85},st2;
	int t=sizeof(student)/sizeof(stu);
	int i=0;
	SqQueue *stuQueue;
	printf("初始化!\n");
	InitQueue(stuQueue);
	printf("構建佇列\n");
	for(i=0;i<t;i++)
	{
		enQueue(stuQueue,student[i]);
	}
	printf("隊長:%d\n",QueueLength(stuQueue));
	
	printf("輸出佇列:\n");
	DispQueue(stuQueue);

	printf("*****************\n");
	printf("隊首出隊:\n");
	deQueue(stuQueue,st2);
	DispStu(st2);
	printf("輸出出隊後的佇列:\n");
	DispQueue(stuQueue);
	printf("隊長:%d\n",QueueLength(stuQueue));

	printf("入隊一個元素:\n");
	enQueue(stuQueue,st1);
	DispQueue(stuQueue);
	printf("隊長:%d\n",QueueLength(stuQueue));
	DestroyQueue(stuQueue);
	return 0;
}