首页 > 其他分享 >循环队列

循环队列

时间:2023-08-13 13:13:19浏览次数:45  
标签:CircularQueue 队列 int maxSize 循环 front include rear

机器翻译

#include <algorithm>
#include <fstream>
#include <iostream>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <vector>

#define DEBUG
using namespace std;

template <typename T>
class CircularQueue {
 private:
  T *arr;
  int front;
  int rear;
  int maxSize;

 public:
  CircularQueue(int size) : maxSize(size + 1), front(0), rear(0) {
    arr = new T[maxSize];
  }

  ~CircularQueue() { delete[] arr; }

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

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

  void enqueue(const T &item) {
    if (isFull()) {
      std::cout << "Queue is full. Cannot enqueue." << std::endl;
      return;
    }
    arr[rear] = item;
    rear = (rear + 1) % maxSize;
  }

  void dequeue() {
    if (isEmpty()) {
      std::cout << "Queue is empty. Cannot dequeue." << std::endl;
      return;
    }
    front = (front + 1) % maxSize;
  }

  int size() { return (rear - front + maxSize) % maxSize; }

  T &frontItem() {
    if (isEmpty()) {
      throw std::runtime_error("Queue is empty.");
    }
    return arr[front];
  }
};

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
#ifdef DEBUG
  ifstream inputFile("in.txt");
  if (inputFile.is_open()) {
    cin.rdbuf(inputFile.rdbuf());
  }
#endif
  using i64 = long long;

  int m, n;
  cin >> m >> n;
  int cnt = 0;
  vector<bool> st(1001);
  CircularQueue<int> Q(m);
  while (n--) {
    int x;
    cin >> x;
    if (!st[x]) {
      cnt++;
      if (Q.size() == m) {
        int tmp = Q.frontItem();
        Q.dequeue();
        st[tmp] = false;
      }
      Q.enqueue(x);
      st[x] = true;
    }
  }
  cout << cnt << '\n';
}

标签:CircularQueue,队列,int,maxSize,循环,front,include,rear
From: https://www.cnblogs.com/hacker-dvd/p/17626430.html

相关文章

  • 循环队列
    C语言实现#include<stdio.h>#defineMAX_SIZE10typedefstruct{intqueue[MAX_SIZE];intfront;intrear;}CircularQueue;voidinitializeQueue(CircularQueue*cq){cq->front=-1;cq->rear=-1;}intisEmpty(CircularQueu......
  • TZOJ3326--Barn Repair(优先队列,贪心)
    题目简述: 某天刮了一阵大风,把牛棚的门吹飞了,总共有s个牛棚,幸运的是并不是每个牛棚都有牛。现在你可以购买m块木板,商店里有各种型号的木板,木板长度为多少就需要多少金钱。木板用来给牛棚装上门。要求把所有有牛的牛棚都装上门,并且花的金钱最少。给了一正整数C,接下来C行每行一......
  • 2308-习题 分支循环,goto语句
    1.习题3.1.输入三个整数,从大到小输出这三个数 1#define_CRT_SECURE_NO_WARNINGS2#include<stdio.h>3intmain()4{56inta=0;7intb=0;8intc=0;9inttemp=0;10scanf("%d%d%d",&a,&b,&c);11......
  • 从Spring源码看Spring如何解决循环引用的问题
    Spring如何解决循环引用的问题关于循环引用,首先说一个结论:Spring能够解决的情况为:两个对象都是单实例、且通过set方法进行注入。两个对象都是单实例,通过构造方法进行注入,Spring不能进行循环引用问题;两个对象都是多实例的情况下,不管是set注入,还是构造注入,都不能解决Spring循环......
  • P1631 序列合并[优先队列]
    P1631序列合并这个没做出来属实有些惭愧。看了题解觉得很妙。如果直接想的话可能反而很麻烦题目是给两个n个数的不下降序列,问这两个序列任意各取出一个后相加的最小的n个数是什么。直接贴题解吧题解P1631【序列合并】一共会产生n*n个数,a[1]+b[1]<=a[1]+b[2]........<=a[1......
  • 不使用循环语句用if和else实现循环
    如果不使用循环语句,可以使用递归函数来实现循环的效果。递归函数是指在函数内部调用自身的函数。下面是一个使用递归函数来实现循环的示例:(初学者记得写include,这里是个普通函数,所以我没写)defloop(count):ifcount<5:ifcount%2==0:......
  • go1.21循环中的变量有变化
    最近发了go1.21.0,听说循环中的变量有变化,跑一下看看。1.21.0默认还是和之前一样的。通过设置goenv-wGOEXPERIMENT=loopvar让新语义生效packagemainimport( "fmt" "sync/atomic" "time")funcmain(){ varis[]int32 fori:=int32(0);i<10;i++{ is......
  • 代码随想录算法训练营第十天|力扣232.用栈实现队列、力扣225.用队列实现栈
    栈与队列理论知识栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。不像是set或者map提供迭代器iterator来遍历所有元素。栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制......
  • Feign和消息队列(MQ)的区别
    Feign和消息队列(MQ)是两个不同的概念,它们分别用于不同的目的。下面我将分别介绍它们的作用和特点。Feign是一个在微服务架构中用于实现服务间通信的轻量级、声明式的HTTP客户端。它由Netflix开源,并且与SpringCloud集成得非常紧密。Feign可以让开发人员以类似于编写本地方法调用的......
  • 单调队列
    单调性的原理可以用一句没有啥道理的但又有点道理的话理解:如果一个人比你小还比你强,你就永远打不过他了。最大子序和输入一个长度为\(n\)的整数序列,从中找出一段长度不超过\(m\)的连续子序列,使得子序列中所有数的和最大。注意:子序列的长度至少是\(1\)。转换成前缀和选......