【数据结构之旅】循环队列

简介:

说明:

    时间关系,这里只给出代码及注释,有空的时候再详细介绍一下代码的实现流程。




1.代码及注释

    如下:

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
# include <stdio.h>
# include <stdlib.h>
 
typedef char ElemType;
typedef struct {
    ElemType  *elem;   // 存储空间的基址
    int  front;         // 队头位标
    int  rear;          // 队尾位标,指示队尾元素的下一位置
    int  maxSize;       // 最大长度
} SqQueue;
 
 
#define OVERFLOW - 1
#define OK  1
#define ERROR  0    
#define TRUE  2
#define FALSE - 2
 
typedef  int  Status;
 
Status InitQueue_Sq(SqQueue &Q,  int  size) {  // 构造一个空队列
    Q.elem = (ElemType *)malloc(size*sizeof(ElemType));
    Q.maxSize = size;
    Q.front = Q.rear =  0 ;
    return  OK;
 
 
Status QueueEmpty_Sq(SqQueue Q){  // 判断队列Q是否空,若空则返回TRUE,否则FALSE
    if (Q.front == Q.rear)
       return  TRUE;
    else  
       return  FALSE; 
}
 
Status EnQueue_Sq(SqQueue &Q, ElemType e) {
         // 若当前队列不满,在队列的尾元素之后,插入元素 e 为新的队列尾元素
 
    if (Q.front == (Q.rear +  1 )%Q.maxSize)
        return  ERROR;
 
    Q.elem[Q.rear] = e;
    Q.rear = (Q.rear +  1 )%Q.maxSize;
    return  OK;
}
 
 
Status DeQueue_Sq(SqQueue &Q, ElemType &e) {
         // 若队列不空,则删除队列Q中的头元素,用 e 返回其值
    if (Q.front == Q.rear)
       return  ERROR;  // 队空报错
    e = Q.elem[Q.front];
    Q.front = (Q.front+ 1 )%Q.maxSize;  // Q.front循环加1
    return  OK;
}
 
int  main( void ) {    
     SqQueue Q;
     ElemType e;
     Status result1, result2;
     
     //1. 初始化一个size为5的循环队列Q
     InitQueue_Sq(Q,  5 );
     EnQueue_Sq(Q,  'A' ); 
     EnQueue_Sq(Q,  'B' ); 
     EnQueue_Sq(Q,  'C' );    
     EnQueue_Sq(Q,  'D' );
     DeQueue_Sq(Q, e);   
     EnQueue_Sq(Q,  'E' );  
     DeQueue_Sq(Q, e);   
     EnQueue_Sq(Q,  'F' );    //出现了要用求余确定来确定新进队列的元素位置,
                           //即“循环使用空间的情况”   
     result1 = EnQueue_Sq(Q,  'G' );    //满了,放不下
    
     printf( "result1 = %d\n" , result1);
                                                
     DeQueue_Sq(Q, e);   
     DeQueue_Sq(Q, e);   
     DeQueue_Sq(Q, e);   
     DeQueue_Sq(Q, e);   
     result2 = DeQueue_Sq(Q, e);    //空了,return FALSE      
       
     printf( "result2 = %d\n" , result2);
                                           
     
}




2.执行结果

    如下:

1
2
3
result1 =  0
result2 =  0
请按任意键继续. . .




3.研究方法

    第2步只是直接给出结果,实际上利用编译器的断点功能可以观察每一步的执行情况,从而加深对循环队列的理解,可以尝试一下。

相关文章
|
12月前
|
存储
初阶数据结构(六)队列的介绍与实现
初阶数据结构(六)队列的介绍与实现
47 0
深入浅出带你玩转栈与队列——【数据结构】
深入浅出带你玩转栈与队列——【数据结构】
52 0
|
5月前
数据结构初阶 队列
数据结构初阶 队列
23 0
|
6月前
|
存储 Java
深入浅出数据结构之链表
深入浅出数据结构之链表
|
存储 缓存 算法
数据结构之栈、队列——算法与数据结构入门笔记(四)
数据结构之栈、队列——算法与数据结构入门笔记(四)
|
6月前
【数据结构】栈和队列(队列的基本操作和基础知识)
【数据结构】栈和队列(队列的基本操作和基础知识)
55 1
|
存储 算法
【数据结构】一篇带你彻底吃透 顺序表
【数据结构】一篇带你彻底吃透 顺序表
55 1
|
存储
深度剖析数据结构之单链表
深度剖析数据结构之单链表
68 0
|
缓存
【数据结构入门】-栈和队列
【数据结构入门】-栈和队列
98 0
|
存储 C语言
初阶数据结构之队列的实现(六)
初阶数据结构之队列的实现(六)
115 0