C++--手动实现循环队列(数组+链表)

力扣:622 循环队列

1.数组

class MyCircularQueue {
private:
    vector<int> data;
    int capacity;//最大容量
    int front;
    int rear;//队尾元素的下一个位置
public:
    MyCircularQueue(int k) {
        this->data=vector<int>(k+1);//牺牲一个单元用来判满
        this->capacity=k+1;
        this->front=0;
        this->rear=0;
    }    
    bool enQueue(int value) {//入队
        //先判满
        if(isFull())
        {
            return false;
        }
        data[rear]=value;
        rear=(rear+1)%capacity;
        return true;
    }
    bool deQueue() {//出队
        //先判空
        if(isEmpty())
        {
            return false;
        }
        front=(front+1)%capacity;
        return true;
    }
    int Front() {//队头元素
        //先判空
        if(isEmpty())
        {
            return -1;
        }
        return data[front];
    }
    int Rear() {//队尾元素
        //先判空
        if(isEmpty())
        {
            return -1;
        }
        return data[(rear-1+capacity)%capacity];//注意这里 当rear到front前面时,比如=0时,就需要这样处理
    }
    bool isEmpty() {//判空
        if(front==rear)
        {
            return true;
        }
        return false;
    }
    
    bool isFull() {//判满
        if((rear+1)%capacity==front)
        {
            return true;
        }
        return false;
    }
};

2.单链表(无头节点和有头节点)

  1. 无头节点
class MyCircularQueue {//2,单链表(无头结点)
private:
    ListNode* front;//指向头节点
    ListNode* rear;//指向尾结点
    int capacity;//最大容量
    int size;//元素个数
public:
    MyCircularQueue(int k) {//初始化
        this->front=this->rear=nullptr;//无头节点
        this->capacity=k;
        this->size=0;
    }
    
    bool enQueue(int value) {//入队--尾插
        //判满
        if(isFull())
        {
            return false;
        }
        ListNode* cur=new ListNode(value);
        cur->val=value;
        if(front==nullptr)//第一次插入
        {
            front=cur;
            rear=cur;
        }
        else//不是第一次插入
        {
            rear->next=cur;
            rear=cur;
        }
        size++;
        return true;
    }
    
    bool deQueue() {//出队
        //判空
        if(isEmpty())
        {
            return false;
        }
        front=front->next;
        size--;
        return true;
    }
    
    int Front() {//队头
        if(isEmpty())
        {
            return -1;
        }
        return front->val;
    }
    
    int Rear() {//队尾
        if(isEmpty())
        {
            return -1;
        }
        return rear->val;
    }
    
    bool isEmpty() {//判空
        if(size==0)
        {
            return true;
        }
        return false;
    }
    
    bool isFull() {//判满
        if(size==capacity)
        {
            return true;
        }
        return false;
    }
};
  1. 有头节点
class MyCircularQueue {
private:
    ListNode* front;//指向头节点
    ListNode* rear;//指向尾结点
    int capacity;//最大容量
    int size;//元素个数
public:
    MyCircularQueue(int k) {//初始化
        this->front=this->rear=(ListNode*)malloc(sizeof(ListNode));//头节点
        this->capacity=k;
        this->size=0;
    }
    bool enQueue(int value) {//入队--尾插
        //判满
        if(isFull())
        {
            return false;
        }
        ListNode* cur=new ListNode(value);
        cur->val=value;
        rear->next=cur;
        rear=cur;
        size++;
        return true;
    }
    bool deQueue() {//出队
        //判空
        if(isEmpty())
        {
            return false;
        }
        if(rear==front->next)//判断是否是删除最后一个结点
        {
            rear=front;
        }
        else
        {
            front->next=front->next->next;
        }
        size--;
        return true;
    } 
    int Front() {//队头
        if(isEmpty())
        {
            return -1;
        }
        return front->next->val;
    }
    int Rear() {//队尾
        if(isEmpty())
        {
            return -1;
        }
        return rear->val;
    }
    bool isEmpty() {//判空
        if(size==0)
        {
            return true;
        }
        return false;
    }
    bool isFull() {//判满
        if(size==capacity)
        {
            return true;
        }
        return false;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值