循环队列的实现笔记-c++

实现方式一  数组实现 

/****
实现方式一  数组实现
**/

#include <iostream>
using namespace std;
class Queue{
private:
    int *data;           //定义指向整型的指针,从而动态开辟内存
    int head,tail,length,count;   //head指向队首,tail指向队尾,length表示队列的长度,count用于记录队列中元素个数,从而判断队列是否已满
public:
    Queue (int length_input){       //构造函数,对新声明的队列对象进行初始化
        data = new int [length_input];      //动态开辟100个整型数据的空间
        length = length_input;              //为队列的长度赋初始值
        head = 0;                       //起初head为0,表示head值未改变的情况下,一直指向首元素
        tail = -1;                      //tail初始值为-1,表示此时队列为空,无任何数据元素
        count = 0;
    }
    ~Queue(){
        delete [] data;             //析构函数,删除动态开辟的内存
    }
     void push(int element){            //入队操作,只能从队列的尾部插入数据元素
        if(count < length){             //队列未满的时候才能插入,否则则插入失败
            tail = (tail + 1) % length;     //分两种情况,如果队尾指针此时并未指向队列的最后一位,那么队尾指针直接前移,而当队尾指针此时指向最后一位时
            data[tail] = element;           //那么当队列未满时,则队尾指针将跳转至数组起始位置,再将数据元素插入队尾指针指向的位置
            ++count;                    //入队成功,队列中元素数量加一
        }
    }
    void pop(){
        if(count < =0){     //队列为空,出队失败
            return;
        }
        head = (head + 1) % length;   //同样,根据循环队列的性质得出,从队头出队,队尾插入
       //这里要取余,比如数列插入到数组尾端,前面有空的时候(一定有count<length),再插入元素的时候,一次插入前面。
        --count;            //出队成功,队列中元素数量减一
    }
    int top(){
        if(count > 0){      //队列不为空的情况下才能获取队首元素
            return data[head];
        }
    }
    void output(){
        for(int i = head;i != tail + 1;i = (i + 1)%length){     //从队首一直遍历到队尾,当遍历到最后一位时,跳转至数组起始位置
                                                                //特别注意此时循环截止的条件应该是i != tail + 1,因此可能tail的值小于head
            cout << data[i] << " ";
        }
        cout << endl;
    }
};
int main() {
    Queue queue(100);               //声明一个队列对象,并初始化
     for(int i = 1;i <= 10;++i){
        queue.push(i);             //将1-10这10个数据元素依次插入队列中
    }
    queue.output();             //调用输出的方法
    cout << "当前的队首元素为:" << queue.top() << endl;
    queue.pop();               //出队
    queue.output();             //调用输出的方法
    cout << "出队操作后的队首元素为:" << queue.top() << endl;
    return 0;
}

实现方式二——链表实现


#include <bits/stdc++.h>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#define MAXSIZE 10
using namespace std;
//循环队列的基本操作
typedef struct {
    int front;  //队头指针
    int rear;   //队尾指针
    int data[MAXSIZE];  //定义顺序队列为一维数组
}SequenQueue;   //循环队列的结构类型为SequenQueue
//初始化
SequenQueue* CreatQueue()
{
    SequenQueue *q;
    q = (SequenQueue *) malloc(sizeof(SequenQueue));
    if(q == NULL)
        return 0;
    q -> front = 0;
    q -> rear = 0;
    return q;
}
//判断是否为空
bool SequenQueue_Empty(SequenQueue *q)
{
    if( q -> front = q -> rear)
        return true;
    return false;
}
//判断队列是否满
bool SequenQueue_Full(SequenQueue *q)
{
    if(q -> front == (q -> rear + 1)%MAXSIZE)
        return true;
    return false;
}
//求循环队列的长度
int SequenQueue_Length(SequenQueue *q)
{
    return  (q -> rear - q -> front + MAXSIZE)%MAXSIZE;
}
//入队
int Enter_SequenQueue(SequenQueue *q,int x)
{
    if(SequenQueue_Full(q))
        return 0; //如果队列满了 返回0
    q -> data[q -> rear] = x;//在队尾插入x
    q -> rear = (q -> rear + 1)%MAXSIZE; //将队尾指针加一
    return 1;
}
//队头元素出队,并通过x返回其值
int Delete_SequenQueue(SequenQueue *q)
{
    if(q ->front == q->rear)
        return 0;
    int x = q -> data[q -> front];
    q -> front = (q -> front + 1)%MAXSIZE; //修改头指针
    return 1;
}
int main()
{
    SequenQueue *Q;
    Q = CreatQueue();
    bool Empty = SequenQueue_Empty(Q);
 
    return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值