1. 程式人生 > >佇列-順序儲存

佇列-順序儲存

佇列

  • 先進先出(FIFO,First In First Out)
  • 只允許從一端插入一端刪除,稱作 入隊出隊 操作。

在這裡插入圖片描述


程式碼例項

queue.h

#ifndef __STACK_H
#define __STACK_H

#define MAX_SIZE 1024

typedef struct QUEUE
{
	void* pData[MAX_SIZE];
	int size;	
	int head;
	int tail;
}Queue;



Queue* Init_Queue(void);

void Push_Queue(Queue*
queue,void* data); void Pop_Queue(Queue* queue); void* Top_Queue(Queue* queue); void* Tail_Queue(Queue* queue); void Clear_Queue(Queue* queue); void Free_Queue(Queue* queue); int Size_Queue(Queue* queue); #endif

queue.c

#include "../include/queue.h"
#include <stdlib.h>

Queue* Init_Queue
(void) { Queue* queue = (Queue*)malloc(sizeof(Queue)); queue->size = 0; queue->head = 0; queue->tail = 0; return queue; } void Push_Queue(Queue* queue,void* data) { if(queue == NULL) return; if(data == NULL) return; if(queue->size == MAX_SIZE) return; queue->pData[queue->
tail] = data; queue->tail++; queue->size++; } void Pop_Queue(Queue* queue) { if(queue == NULL)return; if(queue->size == 0) return; queue->head++; queue->size--; } void* Top_Queue(Queue* queue) { if(queue == NULL) return NULL; if(queue->size == 0) return NULL; return queue->pData[queue->head]; } void* Tail_Queue(Queue* queue) { if(queue == NULL) return NULL; if(queue->size == 0) return NULL; return queue->pData[queue->tail-1];//tail是沒有元素的,tail-1是最後一個 } void Clear_Queue(Queue* queue) { if(queue == NULL) return; queue->size=0; queue->head=0; queue->tail=0; } void Free_Queue(Queue* queue) { if(queue == NULL) return; free(queue); } int Size_Queue(Queue* queue) { if(queue == NULL) return -1; return queue->size; }

main.c

#include <stdio.h>
#include <string.h>
#include "../include/queue.h"

typedef struct PERSION
{
	char name [64];
	int id;	
}Person;


int main(void)
{

	Queue* queue=Init_Queue();
	
	Person p1,p2,p3,p4;
	strcpy(p1.name,"julian");
	strcpy(p2.name,"july");
	strcpy(p3.name,"mike");
	strcpy(p4.name,"kerr");
	
	p1.id = 1;
	p2.id = 2;
	p3.id = 3;
	p4.id = 4;

//插入四個Person 的地址
	Push_Queue(queue,&p1);
	printf("Push %s %d\n",p1.name,p1.id);
	
	Push_Queue(queue,&p2);
	printf("Push %s %d\n",p2.name,p2.id);

	Push_Queue(queue,&p3);
	printf("Push %s %d\n",p3.name,p3.id);

	Push_Queue(queue,&p4);
	printf("Push %s %d\n",p4.name,p4.id);

	printf("Queue size: %d \n\n",queue->size);
	printf("開始Pop\n");

//四個元素出隊	
	while(queue->size)
	{
		Person* p =(Person*) Top_Queue(queue);
		printf("%s %d\n",p->name,p->id);
	    Pop_Queue(queue);	
	}
	printf("after pop 4 times size: %d \n\n",queue->size);

//再插入兩個元素地址
	Push_Queue(queue,&p3);
	printf("Push %s %d\n",p3.name,p3.id);

	Push_Queue(queue,&p4);
	printf("Push %s %d\n",p4.name,p4.id);
//返回 top 和 tail 的元素,列印
	Person* p99 = (Person*)Top_Queue(queue);
	Person* p100 = (Person*)Tail_Queue(queue);
	printf("Top:%s %d\n",p99->name,p99->id);
	printf("Tail:%s %d\n",p100->name,p100->id);
	printf("this times size: %d \n",queue->size);


	Free_Queue(queue);
	return 0;
}

結果:
在這裡插入圖片描述