一、基本概念
队列是只允许在一段进行插入,而在另一端进行删除操作的线性表。
允许插入的称谓队尾,允许删除的一端队头。
顺序队列。
循环队列,
常用操作:入队、出队。//增加元素、删除元素
先进先出,FIFO//与栈相反
typedef int DATATYPE;
typedef struct queue {
DATATYPE *ptr;
int tlen;//总长度
int head;//队头
int tail;//队尾
}SeqQueue;
1.SeqQueue *CreateSeqQueue(int len);
2.int EnterSeqQueue(SeqQueue *queue, DATATYPE *data);
3.int QuitSeqQueue(SeqQueue *queue);
4.int IsEmptySeqQueue(SeqQueue *queue);
5.int IsFullSeqQueue(SeqQueue *queue);
6.DATATYPE* GetHeadSeqQueue(SeqQueue *queue);
7.int DestroySeqQueue(SeqQueue *queue);
1. CreateSeqQueue 创建队列
SeqQueue *CreateSeqQueue(int len) { SeqQueue * sq = malloc(sizeof(SeqQueue)); if(NULL == sq) { perror("CreateSeqQueue"); return NULL; } sq->array = malloc(sizeof(DATATYPE)*len); if(NULL == sq->array) { perror("CreateSeqQueue"); return NULL; } sq->head = 0; sq->tail = 0 ; sq->tlen = len; return sq; }
2. EnterSeqQueue 入队
xxx % queue->tlen // 防止元素出界,控制在tlen-1范围
int EnterSeqQueue(SeqQueue *queue, DATATYPE *data) { if(IsFullSeqQueue(queue)) { fprintf(stderr,"EnterSeqQueue error\n"); return 1; } memcpy(&queue->array[queue->tail],data,sizeof(DATATYPE)); queue->tail = (queue->tail+1)%queue->tlen; return 0; }
3. QuitSeqQueue 出队
int QuitSeqQueue(SeqQueue *queue) { if(IsEmptySeqQueue(queue)) { fprintf(stderr,"QuitSeqQueue error\n"); return 1; } queue->head= (queue->head +1)%queue->tlen; return 0; }
4. IsEmptySeqQueue 队空判断
队空条件:Tail == head
int IsEmptySeqQueue(SeqQueue *queue) { return queue->head == queue->tail; }
5. IsFullSeqQueue 队满判断
队满条件:Tail+1 == Head
int IsFullSeqQueue(SeqQueue *queue) { return queue->head == (queue->tail+1) %queue->tlen; }
6. GetHeadSeqQueue 获得队头元素
DATATYPE *GetHeadSeqQueue(SeqQueue *queue) { if(IsEmptySeqQueue(queue)) { return NULL; } return &queue->array[queue->head]; }
7. DestroySeqQueue 销毁队列
int DestroySeqQueue(SeqQueue *queue) { free(queue->array); free(queue); return 0; }
main.c
#include <stdio.h> #include "seqqueue.h" int main() { SeqQueue* sq = CreateSeqQueue(10); int i = 0 ; for(i = 0 ;i<10;i++) { EnterSeqQueue(sq,&i); } for(i = 0 ;i<10;i++) { DATATYPE* tmp = GetHeadSeqQueue(sq); if(NULL == tmp) { break; } printf("%d\n",*tmp); QuitSeqQueue(sq); } DestroySeqQueue(sq); printf("Hello World!\n"); return 0; }