Форум программистов, компьютерный форум CyberForum.ru

Добавить элементы в очередь - C++

Войти
Регистрация
Восстановить пароль
 
Akana
0 / 0 / 0
Регистрация: 08.12.2012
Сообщений: 29
07.05.2013, 12:12     Добавить элементы в очередь #1
Помогите пожалуйста! Необходимо добавить элементы в очередь, не используя стандартное пространство имен очередей. Функции добавления элемеентов в принципе есть, только у меня не получается...Вот код:
Прототипы функций:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#pragma once
#define MYQUEUE1_EQE   0x0000        // возврат в случае пустоты очереди 
#define MYQUEUE1_EXC   100           // серия кодов исключений 
//----------------------------------------------------------
struct Queue                         // блок управления очередью 
{
 int    Head;                        // голова очереди
 int    Tail;                        // хвост очереди
 int    Size;                        // размер очереди (максимальное количество элементов+1)
 void** Storage;                     // хранилище данных очереди 
 Queue(int size)
 { 
   Head = Tail = 0;
   Storage = new void*[Size = size+1]; // !!! физический размер очереди =  (максимальное количество элементов +1)
 };
bool isFull() const;                    // очередь заполненa ?
bool isEmpty()const;  
// очередь пустa ? 
};
 
//---------------------------------------------------------
Queue CreateQueue(int n);             // выделить ресурса для очереди: n - максимальное количество элементов очереди 
Queue CreateQueue(const Queue& pq);   // создать очередь по образцу 
bool  Enq(Queue& q, void* x);         // добавить x в очередь s
void* Deq(Queue& q);                  // удалить элемент из очереди
void* Peek(const Queue& q);           // получить первый элемент очереди
int  ClearQueue(Queue& q);            // очистить очередь
void ReleaseQueue(Queue& q);          // освободить ресурсы очереди
Собственно сами функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "stdafx.h"
#include <string.h>
#include "MyQueue_1.h"
#include <assert.h>
//------------------------------------------------------------------------
Queue CreateQueue(int n)            // выделить ресурса для очереди
{
 return *(new Queue(n));
};
//-----------------------------------------------------------------------
Queue CreateQueue(const Queue& pq)   // создать очередь по образцу
{
 Queue *rc = new Queue(pq.Size-1);   
 rc->Head = pq.Head;
 rc->Tail = pq.Tail;
 for (int i = 0; i < pq.Size; i++) rc->Storage[i] = pq.Storage[i]; 
 return *rc;
}
//-----------------------------------------------------------------------
bool  Enq(Queue& q, void* x)          // добавить x в очередь s
{
 bool rc = true;
 if (rc = !q.isFull())
 {
  q.Storage[q.Tail] = x;
  q.Tail=(q.Tail+1)%q.Size;
 }
 else 
 return false ; return rc; 
};
//-------------------------------------------------------------------------
void* Deq(Queue& q)                   // удалить элемент из очереди
{
void* rc = (void*)MYQUEUE1_EQE;
 if (!q.isEmpty())
 {
  rc = q.Storage[q.Head];
  q.Head=(q.Head+1)%q.Size;
 }
 return rc; 
}
//-------------------------------------------------------------------------
void* Peek(const Queue& q)
{
void* rc = (void*)MYQUEUE1_EQE;
 if (!q.isEmpty())
    rc = q.Storage[q.Head];
 return rc; 
}  
 
//-------------------------------------------------------------------------
int  ClearQueue(Queue& q)            // очистить очередь
{
    int rc =  (q.Tail - q.Head)>=0?(q.Tail - q.Head):(q.Size-q.Head+q.Tail+1);
 q.Tail = q.Head = 0;
 return rc;                           // количество элементов в очереди до очистки
}
//-------------------------------------------------------------------------
void ReleaseQueue(Queue& q)           // освободить ресурсы очереди
{
 delete[] q.Storage;
 q.Size = 1;
 q.Head = q.Tail = 0;
}
//---------------------------------------------------------------------------
void AppendQueue(Queue& to, const Queue& from)   // добавить одну очередь к другой ()
 
 
 { 
     for (int i = from.Head; i!= from.Tail; (++i)%from.Size) 
         Enq(to, from.Storage[i]); 
 }
 
//---------------------------------------------------------------------------
bool Queue::isFull() const {return (Head%Size == (Tail+1)%Size);};  // очередь заполненa ?
bool Queue::isEmpty()const {return (Head%Size == Tail%Size);};     // Очередь пустa ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2013, 12:12     Добавить элементы в очередь
Посмотрите здесь:

Работа со списком...Не могу добавить функцию добавить элементы в начало списка... C++
добавить элементы в очередь. найти максимальный элемент. C++
Очередь, элементы которой занимают по 12 кБ C++
C++ Дана очередь на n элементов - вывести в порядке возрастание элементы, которые кратны 2,3,5
Создать очередь. Добавить элемент в очередь. Удалить элемент из очереди C++
C++ Очередь Поменять местами элементы через переадресацию
C++ Поместить элементы массива в очередь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
07.05.2013, 12:52     Добавить элементы в очередь #2
Цитата Сообщение от Akana Посмотреть сообщение
стандартное пространство имен очередей
Akana
0 / 0 / 0
Регистрация: 08.12.2012
Сообщений: 29
07.05.2013, 13:10  [ТС]     Добавить элементы в очередь #3
Цитата Сообщение от lemegeton Посмотреть сообщение
Возможно я как-то не так выразилась...Не используя встроенный класс очереди.
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
07.05.2013, 13:39     Добавить элементы в очередь #4
Странный у вас код. Ещё не класс, но и уже не простая структура...
Обозначьте хоть условие задачи и ограничение на инструменты.

Ну или вот вам велосипед с примером.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
 
template <class T>
class Queue {
 public:
  Queue(size_t capacity) : first(0), last(0), capacity(capacity),
    data(new T[capacity]) {}
  Queue(const Queue &other) : data(0) {
    copyFrom(other);
  }
  Queue &operator=(const Queue &other) {
    return copyFrom(other);
  }
  virtual ~Queue() {
    delete [] data;
  }
  void pushBack(const T &value) {
    data[last % capacity] = value;
    last = (last + 1) % (2 * capacity);
  }
  void popFront() {
    first = (first + 1) % (2 * capacity);
  }
  void clear() {
    first = last = 0;
  }
  const T &getFront() const {
    return data[first % capacity];
  }
  const T &getBack() const {
    return data[(last - 1) % capacity];
  }
  size_t getSize() const {
    return last - first;
  }
  bool isEmpty() const {
    return last == first;
  }
  size_t getCapacity() const {
    return capacity;
  }
  size_t getMaximumCapacity() const {
    return (size_t)(-1) / 2;
  }
  Queue &copyFrom(const Queue &other) {
    if (this != &other) {
      delete [] data;
      first = other.first;
      last = other.last;
      capacity = other.capacity;
      data = new T[capacity];
      for (size_t i = first; i != last; ++i) {
        data[i % capacity] = other.data[i % capacity];
      }
    }
    return *this;
  }
 private:
  size_t first;
  size_t last;
  size_t capacity;
  T *data;
};
 
int main(int argc, char *argv[]) {
  Queue<int> q(10);
 
  for (size_t i = 0; i < q.getCapacity(); ++i) {
    q.pushBack(i);
  }
 
  Queue<int> a(q);
 
  while (!a.isEmpty()) {
    std::cout << a.getFront() << std::endl;
    a.popFront();
  }
 
}
Akana
0 / 0 / 0
Регистрация: 08.12.2012
Сообщений: 29
08.05.2013, 00:35  [ТС]     Добавить элементы в очередь #5
Условия задачи: Разработать функцию, которая по одной очереди строит две новых: Queue1 из положительных элементов и Queue2 - из остальных элементов очереди.
Это главная часть кода, в принцепе всё должно работать, только я не могу добавить элементы в очередь с помощью моей функции Enq.
Компилятор выдает:
аргумент типа "int" не совместим с параметром типа "void*"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Queue.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include "MyQueue_1.h"
#include <ctime>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    
    Queue q1= CreateQueue(6);
    Queue q2= CreateQueue(6);
    Queue q3= CreateQueue(6);
 
    
            while (!q1.isEmpty()){
                if (Peek(q1)<0){
                        Enq(q2, Peek(q1));}
                    else 
                    {
                        Enq(q3, Peek(q1));}
                    Deq(q1);
                }
 
  std::cout << "negatives:";
   while (!q2.isEmpty()) {
      std::cout << ' ' << Peek(q2);
     Deq(q2);
   }
   std::cout << std::endl;
 
   std::cout << "positives:";
   while (!q3.isEmpty()) {
      std::cout << ' ' << Peek(q3);
      Deq(q3);
   }
   std::cout << std::endl;
 
   return 0;
}
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.05.2013, 00:52     Добавить элементы в очередь #6
Странный все-таки код. Почему функции isEmpty и isFull включены в класс, а функции добавления, удаления и получения первого элемента -- отдельно от класса? Чем это они так провинились? Минус инкапсуляция, кстати, автоматом.

Цитата Сообщение от Akana Посмотреть сообщение
Компилятор выдает:
аргумент типа "int" не совместим с параметром типа "void*"
Ну правильно "выдает". У вас в очереди какой тип элементов?

Цитирую:
Цитата Сообщение от Akana Посмотреть сообщение
void** Storage; * * * * * * * * * * // хранилище данных очереди
Вы уж разберитесь, шашечки или ехать. Что вы хотите хранить в очереди? Указатель на void или целые числа?
Можно и шаблонами (templates) воспользоваться.

Не по теме:

Цитата Сообщение от Akana Посмотреть сообщение
q.Head=(q.Head+1)%q.Size;
Цитата Сообщение от Akana Посмотреть сообщение
q.Tail=(q.Tail+1)%q.Size;
Это не вполне корректно. Что будет, когда tail вдруг станет больше size? Он станет равным единице и может оказаться меньше head. Вроде ничего страшного, если не проверять, что больше чего конечно. То есть, количество хранимых элементов уже просто так не посчитаешь.

Akana
0 / 0 / 0
Регистрация: 08.12.2012
Сообщений: 29
13.05.2013, 23:25  [ТС]     Добавить элементы в очередь #7
Цитата Сообщение от lemegeton Посмотреть сообщение

Что вы хотите хранить в очереди? Указатель на void или целые числа?
Я хочу что бы в принципе в очереди можно было хранить данные любых типов, но в конкретном случае целые числа. Можете помочь с этим??
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 23:29     Добавить элементы в очередь
Еще ссылки по теме:

C++ Динамическая очередь. Сравнить элементы
Очередь, необходимо вывести все элементы C++
C++ Умножить все элементы последовательности на элемент, находящийся в её середине. (Очередь/ стек)
C++ Добавить целое число в очередь с помощью "operator <<"
Как добавить элемент в очередь, используя указатель на последний элемент? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.05.2013, 23:29     Добавить элементы в очередь #8
Цитата Сообщение от Akana Посмотреть сообщение
Я хочу что бы в принципе в очереди можно было хранить данные любых типов, но в конкретном случае целые числа. Можете помочь с этим??
Я же уже привел пример такой очереди.
Yandex
Объявления
13.05.2013, 23:29     Добавить элементы в очередь
Ответ Создать тему
Опции темы

Текущее время: 23:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru