1. 程式人生 > >資料結構之佇列的基本操作

資料結構之佇列的基本操作

本文章包括了佇列的初始化,插入元素,刪除元素等

  • 佇列結構體的建立
typedef struct 
{
	ElemType *base;//佇列儲存元素,也可用陣列代替
	int front;//佇列頭部
	int rear;//佇列尾部
}SqQueue;
  • 佇列的初始化
void Init_Queue(SqQueue *q)
{
	q->base=(ElemType *)malloc(MAX_QUEUE_SIZE*sizeof(ElemType));
	if(!q->base)//判斷是否還有儲存空間
		exit (0);
	q->front=q->rear=0;//將隊尾和隊頭都指向0處使其初始化
}
  • 入隊
int  Insert_Queue(SqQueue *q,ElemType e)
{
	if((q->rear+1)%MAX_QUEUE_SIZE==q->front)//判斷此佇列是否已滿
		return ERROR;
	q->base[q->rear]=e;//將所插入的元素賦值給隊尾所指處
	q->rear=(q->rear+1)%MAX_QUEUE_SIZE;//將隊尾後移
	return OK;
}
  • 出隊
int Delete_Queue(SqQueue *q,ElemType *e)
{
	if(q->rear==q->front)//判斷當前佇列是否為空
		return ERROR;
	*e=q->base[q->front];//將所要出隊的那個元素取出
	q->front=(q->front)%MAX_QUEUE_SIZE;//隊頭後移
	return OK;
}
  • 簡單的入隊和出隊操作
#include <stdio.h>
#include <stdlib.h>
#define MAX_QUEUE_SIZE 10
#define OK 0
#define ERROR -1

typedef char ElemType;
typedef struct 
{
	ElemType *base;
	int front;
	int rear;
}SqQueue;

void Init_Queue(SqQueue *q)
{
	q->base=(ElemType *)malloc(MAX_QUEUE_SIZE*sizeof(ElemType));
	if(!q->base)
		exit (0);
	q->front=q->rear=0;
}

int  Insert_Queue(SqQueue *q,ElemType e)
{
	if((q->rear+1)%MAX_QUEUE_SIZE==q->front)
		return ERROR;
	q->base[q->rear]=e;
	q->rear=(q->rear+1)%MAX_QUEUE_SIZE;
	return OK;
}	

int Delete_Queue(SqQueue *q,ElemType *e)
{
	if(q->rear==q->front)
		return ERROR;
	*e=q->base[q->front];
	q->front=(q->front)%MAX_QUEUE_SIZE;
	return OK;
}

void Print_Queue(SqQueue *q)//輸出函式
{
	int p;
	printf("OUTPUT Queue: \n");
	p=q->front;
	while(p!=q->rear)
	{
		printf("%d :%c   ",p,q->base[p]);
		p=(p+1)%MAX_QUEUE_SIZE;
	}
	printf("\n");
}

int main()
{
	int flag=1;
	ElemType x;
	SqQueue q;
	Init_Queue(&q);
	while(flag)
	{
		printf("In :1;  OUT :2;  END :0\n");//1代表入隊;2代表出隊;0代表結束操作
		scanf("%d",&flag);
		getchar();
		if(flag==1)
		{
			printf("In:");
			scanf("%c",&x);
			getchar();
			if(Insert_Queue(&q,x)==ERROR)
				printf("ERROR\n");
			/*else
				Print_Queue(&q);*/
		}
		else if(flag==2)
		{
			if(Delete_Queue(&q,&x)==ERROR)
				printf("ERROR\n");
			else
				Print_Queue(&q);
		}
		else if(flag==0)
			break;
	}
	return 0;
}
  • 執行結果如下: