循环队列

循环队列类似栈,但是有两个口,一个专门用来入队,一个专门用来出队。由于入队出队不在一个端口,因此如果不适用循环队列,随着队列的使用,存储空间马上就被耗光了。在循环队列中,一个主要的知识点,就是如何判断队列为空,或者队列满。

这里主要有两个方法:

1 设置一个标记位,初始时,队列为空,我们设置flag=0;随着数据的使用,如果队满,设置flag=1;

2 使用一个空的数据位,这样rear指针永远也不能追上front指针。当front==rear时,队列即为空;当(rear-front)%SIZE==SIZE时,队列为满

数据结构

typedef struct Queue{
    int data[MAXSIZE];
    int front;
    int rear;
}Queue;

入队操作

int inQueue(Queue *q,int num){
    if((q->rear+1)%MAXSIZE == q->front)
        return 0;
    q->data[q->rear] = num;
    q->rear = (q->rear+1)%MAXSIZE;
    return 1;
}

出队操作

int outQueue(Queue *q,int *tar){
    if(q->front == q->rear)
        return 0;
    *tar = q->data[q->front];
    q->front = (q->front+1)%MAXSIZE;
    return 1;
}

示例代码

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define MAXSIZE 10
 4 
 5 typedef struct Queue{
 6     int data[MAXSIZE];
 7     int front;
 8     int rear;
 9 }Queue;
10 
11 void initQueue(Queue *q,int n);
12 void showQueue(Queue *q);
13 int getLength(Queue *q);
14 int inQueue(Queue *q,int num);
15 int outQueue(Queue *q,int *tar);
16 
17 int main()
18 {
19     Queue *q = (Queue *)malloc(sizeof(Queue));
20     initQueue(q,3);
21     showQueue(q);
22 
23     if(inQueue(q,9))
24         showQueue(q);
25 
26     int *tar = (int *)malloc(sizeof(int));
27     if(outQueue(q,tar))
28         printf("the number %d out Queue\n",*tar);
29     showQueue(q);
30 
31     if(outQueue(q,tar))
32         printf("the number %d out Queue\n",*tar);
33     showQueue(q);
34 
35     if(inQueue(q,110))
36         showQueue(q);
37 
38     if(outQueue(q,tar))
39         printf("the number %d out Queue\n",*tar);
40     showQueue(q);
41 
42     if(outQueue(q,tar))
43         printf("the number %d out Queue\n",*tar);
44     showQueue(q);
45 
46     if(outQueue(q,tar))
47         printf("the number %d out Queue\n",*tar);
48     showQueue(q);
49 
50     free(tar);
51     free(q);
52     return 0;
53 }
54 
55 void initQueue(Queue *q,int n){
56     int i;
57     q->front=0;
58     q->rear =0;
59     for(i=0;i<n;i++){
60         q->data[q->rear]=2*i+1;
61         q->rear++;
62     }
63 }
64 void showQueue(Queue *q){
65     int i;
66     int len=getLength(q);
67     printf("front-");
68     for(i=0;i<len;i++){
69         if(q->front+i<MAXSIZE)
70             printf("%d-",q->data[q->front+i]);
71         else
72             printf("%d-",q->data[q->front+i-MAXSIZE]);
73     }
74     printf("rear\n");
75 }
76 int getLength(Queue *q){
77     return (q->rear-q->front+MAXSIZE)%MAXSIZE;
78 }
79 int inQueue(Queue *q,int num){
80     if((q->rear+1)%MAXSIZE == q->front)
81         return 0;
82     q->data[q->rear] = num;
83     q->rear = (q->rear+1)%MAXSIZE;
84     return 1;
85 }
86 int outQueue(Queue *q,int *tar){
87     if(q->front == q->rear)
88         return 0;
89     *tar = q->data[q->front];
90     q->front = (q->front+1)%MAXSIZE;
91     return 1;
92 }
复制代码

运行结果

posted @   xingoo  阅读(3685)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2013-01-27 Oracle二三事之 EBS升级
点击右上角即可分享
微信分享提示