Круговая очередь с функцией отображения, отображающей только четные числа - PullRequest
0 голосов
/ 19 июня 2020

привет, так что у меня есть эта программа c ++ с циклической очередью, мне нужна ее функция отображения, отображает только вставленные числа, только может кто-нибудь здесь поможет, пожалуйста, вот код

Мне нужен способ, чтобы эта программа отображала только даже только числа. Я пытался использовать% 2 == 0 в каком-то месте, которое могло бы иметь смысл, но в основном я ошибаюсь или пустую . . . . . .

#include <iostream>
using namespace std;

int cqueue[5];
int front = -1, rear = -1, n=5;

void insertCQ(int val) {
   if ((front == 0 && rear == n-1) || (front == rear+1)) {
      cout<<"Queue Overflow \n";
      return;
   }
   if (front == -1) {
      front = 0;
      rear = 0;
   } else {
      if (rear == n - 1)
      rear = 0;
      else
      rear = rear + 1;
   }
   cqueue[rear] = val ;
}
void deleteCQ() {
   if (front == -1) {
      cout<<"Queue Underflow\n";
      return ;
   }
   cout<<"Element deleted from queue is : "<<cqueue[front]<<endl;

   if (front == rear) {
      front = -1;
      rear = -1;
   } else {
      if (front == n - 1)
      front = 0;
      else
      front = front + 1;
   }
}
void displayCQ() {
   int f = front, r = rear;
   if (front == -1) {
      cout<<"Queue is empty"<<endl;
      return;
   }
   cout<<"Queue elements are :\n";
   if (f <= r) {
      while (f <= r){
         cout<<cqueue[f]<<" ";
         f++;
      }
   } else {
      while (f <= n - 1) {
         cout<<cqueue[f]<<" ";
         f++;
      }
      f = 0;
      while (f <= r) {
         cout<<cqueue[f]<<" ";
         f++;
      }
   }
   cout<<endl;
}
int main() {

   int ch, val;
   cout<<"1)Insert\n";
   cout<<"2)Delete\n";
   cout<<"3)Display\n";
   cout<<"4)Exit\n";
do {
   cout<<"Enter choice : "<<endl;
   cin>>ch;
   switch(ch) {
      case 1: 
         cout<<"Input for insertion: "<<endl;
         cin>>val;
         insertCQ(val);
         break;

      case 2: 
         deleteCQ();
         break;

      case 3: 
         displayCQ();
         break;

      case 4: 
         cout<<"Exit\n";
         break;
         default: cout<<"Incorrect!\n";
   }
} while(ch != 4);
   return 0;
}

1 Ответ

0 голосов
/ 19 июня 2020

Вот быстрый пример использования std::queue:

#include <iostream>
#include <queue>

int main()
{
  // This deque is declared just to more easily instantiate the queue
  std::deque<int> deck{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  std::queue<int> q{deck};

  while (!q.empty()) {
    if (q.front() % 2 == 0) {
      std::cout << q.front() << ' ';
    }
    q.pop();
  }
  std::cout << '\n';
}

Вы были на правильном пути, используя мод 2, но все в вашей «очереди» неверно. Проще говоря, вы не написали очередь и определенно не циклическую очередь.

Очереди - это структуры данных FIFO; первым прибыл, первым обслужен. Думайте об этом как о туннеле. Я буду добавлять элементы только с одного конца, и я буду удалять элементы только с другого. Все, что находится посередине, значения не имеет, кроме размера очереди. Это означает, что видимые элементы только являются первыми и последними. Если я хочу увидеть второй элемент очереди, я должен удалить первый элемент.

Написанный вами код рассматривает ваш массив как список, где у вас есть свободный доступ ко всем элементам.

Лучше написать реальный класс очереди, и я надеюсь, что если вы пишете структуры данных, вы сможете написать класс.

Вот очень простой c класс очереди, который демонстрирует поведение, о котором вы спрашиваете. В этом нет ничего кругового. Слово «круговой» подразумевает, что ваша очередь должна быть реализована с использованием кругового связанного списка, а не массива. Стоит отметить, что для этого требуется как минимум C ++ 11, но сегодня это не должно быть проблемой.

ВАЖНО Этот код не учитывает множество необходимых проверок ошибок. Например, back(), вероятно, приведет к неопределенному поведению при вызове, помимо прочего, в пустой очереди. Это было сделано намеренно, чтобы избежать прямого копирования / вставки, потому что обманывать домашнее задание - это плохо.

#include <array>
#include <iostream>

namespace Q {
class queue {
public:
  int &front() { return m_arr[0]; }
  int &back() { return m_arr[m_size - 1]; }

  void push(int val) {
    if (m_size < 5) {
      m_arr[m_size] = val;
      ++m_size;
    }
  }

  // Shifts entire array one to the left
  void pop() {
    if (m_size > 0) {
      for (int i = 1; i < m_size; ++i) {
        m_arr[i - 1] = m_arr[i];
      }
      --m_size;
    }
  }

  bool empty() const { return m_size == 0; }

private:
  std::array<int, 5> m_arr = {0};
  int m_size = 0;
};
}; // namespace Q

int main() {
  Q::queue q;
  for (int i = 1; i <= 5; ++i) {
    q.push(i);
  }

  while (!q.empty()) {
    if (q.front() % 2 == 0) {
      std::cout << q.front() << ' ';
    }
    q.pop();
  }
  std::cout << '\n';
}
...