栈和队列的区别在于,栈是先进后出,而队列是先进先出
下面为入队列的过程
下面为出队列的操作
下面是基于顺序表来实现队列的一些操作
对于队列操作,为了操作方便,需要设立三个变量,分别为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 }