栈和队列的区别在于,栈是先进后出,而队列是先进先出
下面为入队列的过程
下面为出队列的操作
下面是基于顺序表来实现队列的一些操作
对于队列操作,为了操作方便,需要设立三个变量,分别为head,tail和size,分别表示,链表的头部、尾部和
链表的长度
5 typedef struct SeqQueue 6 { 7 SeqQueueType data[SeqQueueMaxSize]; 8 size_t head; 9 size_t tail; 10 size_t size; 11 }SeqQueue;
队列初始化
队列初始化是将之前在结构体中设立的三个变量都置为0,详细见程序
5 //队列初始化 6 void SeqQueueInit(SeqQueue* q) 7 { 8 if(q == NULL) 9 { 10 //非法操作 11 return ; 12 } 13 q->size = 0; 14 q->head = 0; 15 q->tail = 0; 16 return ; 17 }
销毁队列
在这里碰巧和队列初始化相同
20 void SeqQueueDestroy(SeqQueue* q) 21 { 22 23 if(q == NULL) 24 { 25 //非法操作 26 return ; 27 } 28 q->size = 0; 29 q->head = 0; 30 q->tail = 0; 31 return ; 32 }
入队列
入队列其实就相当于在链表中插入一个节点,有两种方法,一种为头插法,一种为尾插法,在这里采用的是头插法,详细见程序
34 //入队 35 void SeqQueuePush(SeqQueue* q,SeqQueueType value) 36 { 37 if(q == NULL) 38 { 39 //非法操作 40 return; 41 } 42 if(q->size>=SeqQueueMaxSize) 43 { 44 //队列已满 45 return; 46 } 47 q->data[q->tail++]=value; 48 if(q->tail>=SeqQueueMaxSize) 49 { 50 q->tail=0; 51 } 52 ++q->size; 53 } 54
出队列
出队列就相当于顺序表的头删或者尾删的方法,在这里选择的是顺序表的头删法,详细见程序
55 //出队 56 void SeqQueuePop(SeqQueue* q) 57 { 58 if(q == NULL) 59 { 60 //非法操作 61 return; 62 } 63 if(q->size == 0) 64 { 65 //队列为空 66 return ; 67 } 68 ++q->head; 69 --q->size; 70 if(q->head == SeqQueueMaxSize) 71 { 72 q->head=0; 73 } 74 }
取队首元素
75 //取队首元素 76 int SeqQueueFront(SeqQueue* q,SeqQueueType* value) 77 { 78 if(q == NULL || value == NULL) 79 { 80 //非法操作 81 return 0; 82 } 83 if(q->size == 0) 84 { 85 //队列为空 86 return 0; 87 } 88 *value=q->data[q->head]; 89 return 1; 90 }