zoukankan      html  css  js  c++  java
  • LeetCode622 设计循环队列

    设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
    循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
    你的实现应该支持如下操作:

    • MyCircularQueue(k): 构造器,设置队列长度为 k 。
    • Front: 从队首获取元素。如果队列为空,返回 -1 。
    • Rear: 获取队尾元素。如果队列为空,返回 -1 。
    • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
    • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
    • isEmpty(): 检查循环队列是否为空。
    • isFull(): 检查循环队列是否已满。

    示例:

    MyCircularQueue circularQueue = new MycircularQueue(3); // 设置长度为3
    
    circularQueue.enQueue(1);  // 返回true
    
    circularQueue.enQueue(2);  // 返回true
    
    circularQueue.enQueue(3);  // 返回true
    
    circularQueue.enQueue(4);  // 返回false,队列已满
    
    circularQueue.Rear();  // 返回3
    
    circularQueue.isFull();  // 返回true
    
    circularQueue.deQueue();  // 返回true
    
    circularQueue.enQueue(4);  // 返回true
    
    circularQueue.Rear();  // 返回4
     

     

    提示:

    • 所有的值都在 1 至 1000 的范围内;
    • 操作数将在 1 至 1000 的范围内;
    • 请不要使用内置的队列库。

    //章节 - 队列和栈    
    //一、队列:先入先出的数据结构
    //1.设计循环队列
    /*
    算法思想:
        在循环队列中,我们使用一个数组和两个指针(head 和 tail)。 head 表示队列的起始位置,tail 表示队列的结束位置。
    */
    //算法实现:
    
    class MyCircularQueue {
    private:
        vector<int> data;   //利用动态数组实现
        int head;
        int tail;
        int size;
    public:
        /** Initialize your data structure here. Set the size of the queue to be k. */
        MyCircularQueue(int k) {
            data.resize(k); //队列大小设为k
            head = -1;  //头指针,表示队列的起始位置
            tail = -1;  //尾指针,表示队列的结束位置
            size = k;
        }
        
        /** Insert an element into the circular queue. Return true if the operation is successful. */
        bool enQueue(int value) {   //入队操作
            if (isFull()) { //队满,不能入队
                return false;
            }
            if (isEmpty()) {    //如果队空,则直接入队
                head = 0;
            }
            tail = (tail + 1) % size;
            data[tail] = value;
            return true;
        }
        
        /** Delete an element from the circular queue. Return true if the operation is successful. */
        bool deQueue() {
            if (isEmpty()) {    //队空,不能出队
                return false;
            }
            if (head == tail) { //如果只剩一个结点
                head = -1;
                tail = -1;
                return true;
            }
            head = (head + 1) % size;
            return true;
        }
        
        /** Get the front item from the queue. */
        int Front() {
            if (isEmpty()) {
                return -1;
            }
            return data[head];
        }
        
        /** Get the last item from the queue. */
        int Rear() {
            if (isEmpty()) {
                return -1;
            }
            return data[tail];
        }
        
        /** Checks whether the circular queue is empty or not. */
        bool isEmpty() {    //循环队列是否为空
            return head == -1;
        }
        
        /** Checks whether the circular queue is full or not. */
        bool isFull() { //循环队列是否已满
            return ((tail + 1) % size) == head;
        }
    };
    
    /**
     * Your MyCircularQueue object will be instantiated and called as such:
     * MyCircularQueue obj = new MyCircularQueue(k);
     * bool param_1 = obj.enQueue(value);
     * bool param_2 = obj.deQueue();
     * int param_3 = obj.Front();
     * int param_4 = obj.Rear();
     * bool param_5 = obj.isEmpty();
     * bool param_6 = obj.isFull();
     */
  • 相关阅读:
    ObjectDataSource用法之六(刪除)
    ObjectDataSourc用法之七(新增)
    C# 装箱和拆箱
    Android SD卡中压缩包解压(ZIP文件)
    Android 调用系统的拨号服务实现 电话拨打功能
    Android 判断SD卡存不存在
    android中IdleHandler的使用
    android使用遥控器模拟鼠标拖拽操作
    Android SD卡 文件或目录拷贝、复制、粘贴
    C#在线获取歌词(转)
  • 原文地址:https://www.cnblogs.com/parzulpan/p/10061554.html
Copyright © 2011-2022 走看看