数据结构之队列

队列

这里用循环数组队列演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

#include <stdlib.h>
#include <sys/malloc.h>
#include <stdbool.h>

#define LEN 6

typedef struct LQueue;
typedef struct *PQueue;

struct
{
int *pBase;
int front;
int rear;
};

void init(PQueue);
bool enqueue(PQueue, int);
bool dequeue(PQueue, int *);
void show(PQueue);
bool is_full(PQueue);
bool is_empty(PQueue);

int main(void)
{
int val;
LQueue queue;

init(&queue);
//入队
enqueue(&queue, 1);
enqueue(&queue, 2);
enqueue(&queue, 3);
show(&queue);
// 出队
if(dequeue(&queue,&val))
{
printf("出队元素是:%dn", val);
}
show(&queue);
printf("插入元素:");
scanf("%d", &val);
enqueue(&queue, val);
show(&queue);

return 0;
}


void init(PQueue queue)
{
queue->pBase = (int *)malloc(sizeof(int) * LEN); // 数组第一个元素
queue->front = 0; // 队头
queue->rear = 0; // 队尾
return;
}

// 入队
bool enqueue(PQueue queue, int val)
{
if (is_full(queue))
{
return false;
}
else
{
// 队尾指向下一个位置,因为是循环队列,使用求余计算位置
queue->pBase[queue->rear] = val;
queue->rear = (queue->rear + 1) % LEN;
return true;
}
}

// 满
bool is_full(PQueue queue)
{
if ((queue->rear + 1) % LEN == queue->front)
{
return true;
}
else
{
return false;
}
}

// 展示
void show(PQueue queue)
{
if (is_empty(queue))
{
printf("空队列n");
}
else
{
int i = queue->front;
while (i != queue->rear)
{
printf("%dn", queue->pBase[i]);
i = (i + 1) % LEN;
}
}
return;
}

// 空
bool is_empty(PQueue queue)
{
if(queue->front == queue->rear)
{
return true;
}
else
{
return false;
}
}

// 出队
bool dequeue(PQueue queue, int *pVal)
{
if(is_empty(queue))
{
printf("空队列n");
return false;
}
else
{
*pVal = queue->pBase[queue->front];
queue->front = (queue->front + 1) % LEN;
return true;
}
}