每日一道算法题 设计循环双端队列

题目

641. 设计循环双端队列 - 力扣(LeetCode)

Python

class MyCircularDeque:
    """
    使用固定长度的栈来和头指针front,尾指针rear来实现,
    注意rear并不是指着队列的最后一个,而是指着最后一个的下一个。
    还有就是,front+-1,rear+-1必须有取余操作
    """
    def __init__(self, k: int):
        self.front=self.rear=0
        # 有一块空间仅用来判断队满,不用来存值
        self.qu=[0]*(k+1)
        self.le=k+1

    def insertFront(self, value: int) -> bool:
        
        if self.isFull():
            return False
        self.front=(self.front-1)%self.le
        self.qu[self.front]=value
        return True

    def insertLast(self, value: int) -> bool:
        if self.isFull():
            return False
        self.qu[self.rear]=value
        self.rear=(self.rear+1)%self.le
        return True

    def deleteFront(self) -> bool:
        if self.isEmpty():
            return False
        self.front=(self.front+1)%self.le
        return True
    def deleteLast(self) -> bool:
        if self.isEmpty():
            return False
        self.rear=(self.rear-1)%self.le
        return True

    def getFront(self) -> int:
       return -1 if self.isEmpty() else self.qu[self.front]

    def getRear(self) -> int:

       return -1 if self.isEmpty() else self.qu[(self.rear-1)%self.le]


    def isEmpty(self) -> bool:
        return self.front==self.rear


    def isFull(self) -> bool:

        return (self.rear+1)%self.le ==self.front

C++

class MyCircularDeque {
public:
    vector<int> qu;
    int le;
    int front;
    int rear;
    MyCircularDeque(int k) 
    {
        le=k+1;
        while(k-- >-1) qu.emplace_back(0);
        front=0;
        rear=0;
    }
    
    bool insertFront(int value) 
    {
        if(isFull()) return false;
        front=(front-1+le)%le;
        qu[front]=value;
        return true;
    }
    
    bool insertLast(int value) 
    {
        if(isFull()) return false;
        qu[rear]=value;
        rear=(rear+1)%le;
        return true;
    }
    
    bool deleteFront() 
    {
        if(isEmpty()) return false;
        front=(front+1)%le;
        return true;
    }
    
    bool deleteLast() 
    {
        if(isEmpty()) return false;
        rear=(rear-1+le)%le;
        return true;
    }
    
    int getFront() 
    {
        return isEmpty()?-1:qu[front];

    }
    
    int getRear() 
    {
        return isEmpty()?-1:qu[(rear-1+le)%le];

    }
    
    bool isEmpty() 
    {
        return front==rear;

    }
    
    bool isFull() 
    {
        return (rear+1)%le==front;

    }
};

C语言

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值