Fork me on GitHub

数据结构与算法——循环队列

在队列的顺序存储中,采用出队方式 2, 删除 front 所指的元素,然后加 1 并返回被删元素。这样可以避免元素移动,但是也带来了一个新的问题“假溢出”。

 

 

能否利用前面的空间继续存储入队呢?采用循环队列

 

 

 

循环队列入队, 队尾循环后移: SQ->rear =(SQ->rear+1)%Maxsize;

循环队列出队, 队首循环后移: SQ->front =(SQ->front+1)%Maxsize;

队空:SQ.front=SQ.rear;           // SQ.rear 和 SQ.front 指向同一个位置

队满: (SQ.rear+1) %Maxsize=SQ.front;   // SQ.rear 向后移一位正好是 SQ.front

 

计算元素个数: 可以分两种情况判断:

如果 SQ.rear>= SQ.front:元素个数为 SQ.rear-SQ.front;

如果 SQ.rear<SQ.front:元素个数为 SQ.rear-SQ.front+ Maxsize;

采用取模的方法把两种情况统一为:(SQ.rear-SQ.front+Maxsize)% Maxsize

 

完整代码实现:

  1 #include <stdio.h>
  2 #include <assert.h>
  3 #include <Windows.h>
  4 #include <iostream> 
  5 #include <iomanip> 
  6 
  7 using namespace std;
  8 
  9 #define MaxSize 5 //循环队列的最大容量 
 10 typedef int DataType; //循环队列中元素类型
 11 
 12 typedef struct Queue
 13 {
 14     DataType queue[MaxSize];
 15     int front; //循环队头指针 
 16     int rear; //循环队尾指针
 17 }SeqQueue;
 18 
 19 //队列初始化,将循环队列初始化为空队列
 20 void InitQueue(SeqQueue* SQ)
 21 {
 22     if (!SQ) return;
 23     SQ->front = SQ->rear = 0; //把对头和队尾指针同时置0
 24 }
 25 
 26 //判断队列为空
 27 int IsEmpty(SeqQueue* SQ)
 28 {
 29     if (!SQ) return 0;
 30     if (SQ->front == SQ->rear)
 31     {
 32         return 1;
 33     } return 0;
 34 }
 35 
 36 //判断循环队列是否为满
 37 int IsFull(SeqQueue* SQ)
 38 {
 39     if (!SQ) return 0;
 40     if ((SQ->rear + 1) % MaxSize == SQ->front)
 41     {
 42         return 1;
 43     } return 0;
 44 }
 45 
 46 //入队,将元素data插入到循环队列SQ中
 47 int EnterQueue(SeqQueue* SQ, DataType data) 
 48 {
 49     if (!SQ) return 0;
 50     if (IsFull(SQ)) 
 51     {
 52         cout << "无法插入元素 " << data << ", 队列已满!" << endl; return 0;
 53     }
 54     SQ->queue[SQ->rear] = data;            //在队尾插入元素data 
 55     SQ->rear=(SQ->rear+1)%MaxSize;        //队尾指针循环后移一位
 56     return 1;
 57 }
 58 
 59 //出队,将队列中队头的元素data出队,出队后队头指针front后移一位
 60 int DeleteQueue(SeqQueue* SQ, DataType* data)
 61 {
 62     if (!SQ || IsEmpty(SQ))
 63     {
 64         cout << "循环队列为空!" << endl;
 65         return 0;
 66     }
 67     *data = SQ->queue[SQ->front];            //出队元素值
 68     SQ->front = (SQ->front + 1) % MaxSize;    //队首指针后移一位 
 69     return 1;
 70 }
 71 
 72 //打印队列中的各元素
 73 void PrintQueue(SeqQueue* SQ)
 74 {
 75     if (!SQ) return;
 76     int i = SQ->front; while (i != SQ->rear)
 77     {
 78         cout << setw(4) << SQ->queue[i];    
 79         i = (i + 1) % MaxSize;
 80     }
 81     cout << endl;
 82 }
 83 
 84 //获取队首元素,不出队
 85 int GetHead(SeqQueue* SQ, DataType* data)
 86 {
 87     if (!SQ || IsEmpty(SQ))
 88     {
 89         cout << "队列为空!" << endl;
 90     }
 91     return *data = SQ->queue[SQ->front];
 92 }
 93 
 94 //清空队列
 95 void ClearQueue(SeqQueue* SQ)
 96 {
 97     if (!SQ) return;
 98     SQ->front = SQ->rear = 0;
 99 }
100 
101 //获取队列中元素的个数
102 int getLength(SeqQueue* SQ) 
103 {
104     if (!SQ) return 0;
105     return (SQ->rear - SQ->front + MaxSize) % MaxSize;
106 }
107 
108 int main()
109 {
110     SeqQueue* SQ = new SeqQueue; DataType data = -1;
111     //初始化队列
112     InitQueue(SQ);
113     //入队
114     for (int i = 0; i < 7; i++) 
115     {
116         EnterQueue(SQ, i);
117     }
118 
119     //打印队列中的元素
120     printf("队列中的元素(总共%d 个):", getLength(SQ));
121     PrintQueue(SQ); 
122     cout << endl;
123 
124     //出队
125     for (int i = 0; i < 5; i++) 
126     {
127         if (DeleteQueue(SQ, &data)) 
128         {
129             cout << "出队的元素是:" << data << endl;
130         }
131         else 
132         {
133             cout << "出队失败!" << endl;
134         }
135     }
136 
137     //打印队列中的元素
138     printf("出队五个元素后,队列中剩下的元素个数为 %d 个:", getLength(SQ));
139     PrintQueue(SQ); 
140     cout << endl;
141 
142     //入队4个
143     for (int i = 0; i < 4; i++) 
144     {
145         EnterQueue(SQ, i + 10);
146     }
147     printf("\n入队四个元素后,队列中剩下的元素个数为 %d 个:", getLength(SQ));
148     PrintQueue(SQ);
149     system("pause"); 
150     return 0;
151 }

 

 

 

 

 

==================================================================================================================

posted @ 2020-09-02 16:14  索智源  阅读(420)  评论(0编辑  收藏  举报