ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数据结构(7) - 顺序队列

2022-06-25 16:04:13  阅读:117  来源: 互联网

标签:顺序 LPSEQUEUE lpqueue 队列 queue int 数据结构 data sequeue


顺序队列是队列的顺序存储结构,顺序队列实际上是运算受限的顺序表。和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素。由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应设置为0。

sequence-queue.c

 1 /**
 2  * C data structure sequence queue example.
 3  * 
 4  * License - MIT.
 5 */
 6 
 7 #include "sequence-queue.h"
 8 
 9 
10 /**
11  * sequeue_isempty - Determine if the queue is empty.
12 */
13 bool sequeue_isempty(LPSEQUEUE lpqueue)
14 {
15     return (lpqueue->front == lpqueue->rear);
16 }
17 
18 
19 /**
20  * sequeue_isfull - Determine if the queue is full.
21 */
22 bool sequeue_isfull(LPSEQUEUE lpqueue)
23 {
24     return (lpqueue->front == (lpqueue->rear + 1) % MAX_DATA_SIZE);
25 }
26 
27 
28 /**
29  * sequeue_put - Put data to queue.
30 */
31 int sequeue_put(LPSEQUEUE lpqueue, int data)
32 {
33     /* Determine if sequential stack is full. */
34     if (sequeue_isfull(lpqueue))
35         return -1;
36 
37     /* Put data to stack. */
38     lpqueue->rear = (lpqueue->rear + 1) % MAX_DATA_SIZE;
39     lpqueue->data[lpqueue->rear] = data;
40 
41     return 0;
42 }
43 
44 
45 /**
46  * sequeue_get - Get data from queue.
47 */
48 int sequeue_get(LPSEQUEUE lpqueue, int *data)
49 {
50     /* Determine if sequential stack is empty. */
51     if (sequeue_isempty(lpqueue))
52         return -1;
53 
54     /* Get data from stack. */
55     lpqueue->front = (lpqueue->front + 1) % MAX_DATA_SIZE;
56     *data = lpqueue->data[lpqueue->front];
57 
58     return 0;
59 }
60 
61 
62 /**
63  * sequeue_init - Initialize sequence queue.
64 */
65 int sequeue_init(LPSEQUEUE *lpqueue)
66 {
67     /* Allocate memory space. */
68     *lpqueue = (LPSEQUEUE) malloc(sizeof(SEQUEUE));
69 
70     if (NULL == *lpqueue) {
71         printf("Error in queue init.\n");
72         return -1;
73     }
74 
75     (*lpqueue)->front = MAX_DATA_SIZE - 1;
76     (*lpqueue)->rear  = MAX_DATA_SIZE - 1;
77 
78     return 0;
79 }
80 
81 
82 /**
83  * sequeue_clear - Clear sequence queue.
84 */
85 int sequeue_clear(LPSEQUEUE lpqueue)
86 {
87     int tmp = -1;
88 
89     while (!sequeue_isempty(lpqueue))
90     {
91         sequeue_get(lpqueue, &tmp);
92     }
93 
94     free(lpqueue);
95     lpqueue = NULL;
96 
97     return 0;
98 }

sequence-queue.h

 1 /**
 2  * C data structure sequence queue example.
 3  * 
 4  * License - MIT.
 5 */
 6 
 7 #ifndef __SEQUENCE_QUEUE_H__
 8 #define __SEQUENCE_QUEUE_H__
 9 
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <stdbool.h>
14 
15 #define MAX_DATA_SIZE               10
16 
17 typedef struct _SEQUEUE {
18     int data[MAX_DATA_SIZE];
19     int front, rear;
20 } SEQUEUE, *LPSEQUEUE;
21 
22 
23 bool sequeue_isempty (LPSEQUEUE lpqueue);
24 bool sequeue_isfull  (LPSEQUEUE lpqueue);
25 int sequeue_put      (LPSEQUEUE lpqueue, int data);
26 int sequeue_get      (LPSEQUEUE lpqueue, int *data);
27 int sequeue_init     (LPSEQUEUE *lpqueue);
28 int sequeue_clear    (LPSEQUEUE lpqueue);
29 
30 
31 #endif /* __SEQUENCE_QUEUE_H__ */

main.c

 1 /**
 2  * C data structure sequence queue example.
 3  * 
 4  * License - MIT.
 5 */
 6 
 7 #include <stdio.h>
 8 
 9 #include "sequence-queue.h"
10 
11 
12 /**
13  * queue_test - Use queue test example.
14 */
15 int queue_test(LPSEQUEUE lpqueue, int buf[], int len)
16 {
17     int i = 0;
18     int data = 0;
19 
20     printf("Put data: ");
21 
22     for (i = 0; i < len; i++) {
23         sequeue_put(lpqueue, buf[i]);
24         printf("%d ", buf[i]);
25     }
26 
27     printf("\nGet data: ");
28 
29     for (i = 0; i < len; i++) {
30         sequeue_get(lpqueue, &data);
31         printf("%d ", data);
32     }
33 
34     printf("\n");
35 
36     return 0;
37 }
38 
39 
40 /**
41  * Main function.
42 */
43 int main(void)
44 {
45     int buf[5] = {1, 2, 3, 4, 5};
46     LPSEQUEUE sequeue = NULL;
47 
48     sequeue_init(&sequeue);
49 
50     queue_test(sequeue, buf, 5);
51 
52     sequeue_clear(sequeue);
53 
54     return 0;
55 }

Makefile

 1 # Makefile
 2 CC = gcc
 3 CFLAGS = -Wall -g -O0
 4 
 5 SRC = main.c sequence-queue.c
 6 
 7 OBJ = sequeue-test
 8 
 9 $(OBJ) : $(SRC)
10     $(CC) $(CFLAGS) -o $@ $^
11 
12 clean:
13     $(RM) $(OBJ) *.o *.*.sw?

 

详细请参考Github: [Link] [https://github.com/Phoebus-Ma/C-Helper/tree/main/Class-1/Queue.C].

标签:顺序,LPSEQUEUE,lpqueue,队列,queue,int,数据结构,data,sequeue
来源: https://www.cnblogs.com/tinyshark/p/16411768.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有