循环队列-抽象数据类型

1.初始化队列

2.获取队列长度

3.入队

4.出队

5.获取循环队列头元素

6.判断是否为空队列

7.遍历循环队列

8.销毁队列

 
代码
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define MAXQSIZE 100
  4 typedef struct{
  5     int *base;
  6     int front;
  7     int rear;
  8 }SqQueue;
  9 
 10 bool InitQueue(SqQueue &Q)
 11 {
 12     Q.base = (int *)malloc(MAXQSIZE*sizeof(int));
 13     if(!Q.base) exit(-1);
 14     Q.front = Q.rear = 0;
 15     return 1;
 16 } 
 17 
 18 int QueueLength(SqQueue &Q)
 19 {
 20     return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
 21 }
 22 
 23 bool EnQueue(SqQueue &Q,int e)
 24 {
 25     if((Q.rear + 1) % MAXQSIZE == Q.front) return 0;//表示队列已经满了
 26     Q.base[Q.rear] = e;//有很多人这里就一脸懵逼,什么东西,下面解释一下
 27 //Q.base 指向动态分配的数组中的元素。
 28 //a[n] 在C语言中相当于 (a+n),即使 a 是数组,
 29 //也会被转换成指向第一个元素的指针。(T*)a+n,
 30 //得到的是数组里的第 n 个元素的指针。
 31 //数组的元素访问就是按这样的方式实现的。 
 32     Q.rear = (Q.rear + 1) % MAXQSIZE;
 33     return 1;
 34 }
 35 
 36 bool DeQueue(SqQueue &Q,int &e)
 37 {
 38     if(Q.front == Q.rear) return 0;//队列为空一个元素都没有
 39     e = Q.base[Q.front];
 40     Q.front = (Q.front + 1) % MAXQSIZE;
 41     return 1;
 42 } 
 43 
 44 bool GetHead(SqQueue Q,int &e)
 45 {
 46     if(Q.front == Q.rear) return 0;
 47     e = Q.base[Q.front];
 48     return 1;
 49 }
 50 
 51 bool Empty(SqQueue *Q) 
 52 {
 53    if(Q->rear == Q->front)
 54    return 1;
 55    return 0;
 56 }
 57 
 58 void TraverQueue(SqQueue &Q)
 59 {
 60     int cur = Q.front;
 61     while(cur != Q.rear)
 62     {
 63         cout << Q.base[cur] << " ";
 64         cur++;
 65     }
 66     puts("");
 67 }
 68 
 69 void DestroyQueue(SqQueue *Q)  //销毁该队列
 70 {
 71         free(Q->base);
 72         Q->front=Q->rear=0;
 73 }
 74 
 75 int main()
 76 {
 77     SqQueue Q;
 78     InitQueue(Q);
 79     int x;
 80     for(int i = 5;i >= 1;i--)
 81     {
 82         EnQueue(Q,i);
 83     }
 84     TraverQueue(Q);
 85     cout << "Qlength = " << QueueLength(Q) << endl;
 86     bool ok = DeQueue(Q,x);
 87     if(ok)
 88     {
 89         cout << "x = " << x << endl;
 90         TraverQueue(Q);
 91         cout << "After DeQueue Qlength = " << QueueLength(Q) << endl;
 92     }
 93     
 94     ok = GetHead(Q,x);
 95     if(ok)
 96     cout << "Qhead = " << x << endl;
 97     DestroyQueue(&Q);
 98     cout << Q.front << " " << Q.rear << endl;
 99     TraverQueue(Q);//验证是否销毁 
100     return 0;
101 }
View Code
原文地址:https://www.cnblogs.com/mch5201314/p/11630462.html