Как найти минимальный элемент очереди

I have queue from struct type

struct test {
   int numbers;
};

queue<test> q;

how to find min value from:

q.front().numbers;

For example if in numbers have 5,1,3 I need to found 1.

asked Jun 19, 2012 at 11:41

Nikolai Cekov's user avatar

Nikolai CekovNikolai Cekov

1773 gold badges3 silver badges11 bronze badges

6

Since you need a queue of integers the easiest solution is to use std::deque<int>. Then you could use std::min_element to find the minimum element in the queue:

std::deque<int> q{5, 1, 3};
std::deque<int>::iterator it = std::min_element(q.begin(), q.end());
std::cout << *it << std::endl;

By doing so, you do not need to use the struct test. This is especially true since it seems to just store an integer. If, on the other hand, struct test is more complex (having more fields) then you can use exactly the same approach but defining a compare function for struct test (see @fljx answer for an example of such a compare function).

If you can only use a queue you are restricted on the type of operations that you can do. Therefore, you would need to do something like:

std::queue<int> q;
/* fill queue ... */
int min_value = INT_MAX;
std::size_t size = q.size();
while (size-- > 0) {
    int x = q.front();
    q.pop();
    q.push(x);
    if (x < min_value)
        min_value = x;
}

answered Jun 19, 2012 at 12:04

betabandido's user avatar

betabandidobetabandido

18.8k11 gold badges60 silver badges76 bronze badges

5

There is a bunch of pages explaining it around the web.

You need to create an operator < telling how your structure is to be compared.

struct test {
   int numbers;

    bool operator < ( const test &t ) const
    { return this->numbers < t.numbers; }
};

(I haven’t tested this code for any silly error, but the links bellow may help if you find any problem).

After then, use #include <algorithm> to have access to min_element().

References:
http://www.cplusplus.com/reference/algorithm/min_element/
http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html

answered Jun 19, 2012 at 12:04

j4x's user avatar

j4xj4x

3,5573 gold badges33 silver badges63 bronze badges

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
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//---------------------------------------------------------------------------
#include <iostream.h>
#include <conio.h>
#include <vcl.h>
#pragma hdrstop
 
 
//---------------------------------------------------------------------------
typedef struct Queue
{
  int size;
  int value;
  struct Queue *next;
} *Queuep;
 
Queuep first = NULL, last = NULL;
int size=0;
//---------------------------------------------------------------------------
Queuep Cherga (Queuep &last) // создание очереди
{ Queuep q;
  cout << "Введите элементы очереди: ";
  first = new Queue;
  q = first;
  first->next = NULL;
  cin >> first->value;
  size++;
  cout << "Следующий? (Y/N): ";
  char c;
  cin>>c;
  while ((c == 'y')||(c == 'Y'))
    {
      cout << "Введите элементы очереди: ";
      q->next = new Queue;
      cin >> q->next->value;
      size++;
      q->next->next = NULL;
      q = q->next;
      cout << "Следующий? (Y/N): ";
      cin>>c;
    }
    last = q;
    last->size = size;
  return first;
}
//---------------------------------------------------------------------------
int Full () // проверка на пустоту.
{
  int flag = 0;
  if (first != NULL)
    flag = 0;
  else
    flag = 1;
  return flag;
}
//---------------------------------------------------------------------------
Queuep addCherga () // добавление элементов в очередь
{
  Queuep q = new Queue;
  SetConsoleOutputCP(1251);
  cin >> q->value;
  q->next = NULL;
  last->next = q;
  last = q;
  size++;
  last->size = size;
  cout << "Элемент добавлено в очередь.nn";
}
//---------------------------------------------------------------------------
Queuep delCherga () // удаление элементов в очереди
{
  SetConsoleOutputCP(1251);
  Queuep q;
  if (Full() == 1)
    cout << "Очередь пустая !!!n";
  else
    {
      q = first;
      first = first->next;
      last->size--;
      free (q);
      cout << "Элемент удалено.nn";
    }
  return first;
}
//---------------------------------------------------------------------------
int Size () // количество элементов очереди
{
  return last->size;
}
//---------------------------------------------------------------------------
void PrintCherga (Queue *q, Queue *p) // вывод очереди 
{
  SetConsoleOutputCP(1251);
  while (q != NULL)
    {
      cout << "Элементы очереди: " << q->value << endl;
      q=q->next;
    }
}
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
  SetConsoleOutputCP(1251);
  if (Full() == 1)
    cout << "Очередь пустая !!!n";
  first = Cherga(last);
  cout << "n";
  PrintCherga (first, last);
  cout << "nКоличество элементов очереди -  " << Size();
  cout << "nnnХотите добавить ещё элемент? (Y/N)";
  char b;
  cin >> b;
  while ((b == 'Y')||(b == 'y'))
    {
      cout << "Введите элемент очереди: ";
      addCherga ();
      cout << "Будет следующий? (Y/N)";
      cin >> b;
    }
  cout << "n";
  PrintCherga (first, last);
  cout << "nКоличество элементов очереди -  " << Size();
  cout << "nnnХотите удалить элемент? (Y/N)";
  cin >> b;
  while ((b == 'Y')||(b == 'y'))
    {
      first = delCherga ();
      cout << "Будет следующий? (Y/N)";
      cin >> b;
    }
  cout << "n";
  PrintCherga (first, last);
  cout << "nКоличество элементов очереди -  " << Size();
  getch();
        return 0;
}
//---------------------------------------------------------------------------

Я думаю проверку нужно делать в функции Queuep delCherga (). Помогите доделать.

Добавлено через 2 часа 47 минут
Кстати, я условие не дописал. Если первый элемент минимальный, то поместить его в конец очереди, если не минимальный — удалить из очереди.

Добавлено через 1 час 19 минут
Помогите кто-нибудь…

Asked
11 years, 6 months ago

Viewed
5k times

I am making application using c#. I have one queue as follows…

Queue QueueData = new Queue(60);

I want to find the min and max element from that queue. Any ideas?

Ryan Berger's user avatar

Ryan Berger

9,6146 gold badges44 silver badges56 bronze badges

asked Nov 29, 2011 at 14:01

Dany's user avatar

6

Of course, you must specify what value you want the max and min values of:

var max = QueueData.Max(x => x.SomeSelectedComparableValue);
var min = QueueData.Min(x => x.SomeSelectedComparableValue);

answered Nov 29, 2011 at 14:05

Roy Dictus's user avatar

Roy DictusRoy Dictus

32.4k8 gold badges60 silver badges76 bronze badges

3

Структура данных очередь используется во многих алгоритмах. Помимо стандартных операций иногда существует необходимость в получении минимального (максимального) элемента за константное время. Поддержка такой статистики со стеком реализуется тривиально — вместе с добавленным элементом сохраняется минимум всех элементов на стеке (рассчитывается как минимум из добавленного элемента и значения минимума предыдущих значений на стеке). Этот подход адаптируется и для очереди. Как известно очередь можно реализовать с помощью двух стеков: стек для добавления элементов S1 и стек для изъятия элементов S2. Т.е. любое добавление в очередь добавляет элемент в S1, а любое изъятие проверяет стек S2 и если он пустой, то  перекладывает все элементы из S1 в S2. После этого извлекает элемент с вершины стека S2. Т.о. реализовав очередь с помощью двух стеков с поддержкой минимального элемента, мы в любой момент можем получить минимум в очереди как минимум минимальных элементов стека S1 и S2.

#define ZERO (1LL<<60)
#define ADD(x, y) (min((x), (y)))

typedef pair<lint, lint> plii;
typedef long long lint;

const int MAX = 1000000 + 10;

struct Queue {
    
    plii v1[MAX], v2[MAX];
    int n1, n2;
    
    Queue() {
        clear();
    }
    
    void push(lint x) {
        v1[n1] = mp(x, ADD(x, v1[n1 - 1].second));
        n1++;
    }
    
    void pop() {
        if (n2 == 1) {
            while (n1 > 1) {
                lint x = v1[--n1].first;
                v2[n2] = mp(x, ADD(x, v2[n2 - 1].second));
                n2++;
            }
        }
        n2--;
    }
    
    lint get() {
        return ADD(v1[n1 - 1].second, v2[n2 - 1].second);
    }
    
    int size() {
        return n1 + n2 - 2;
    }
    
    void clear() {
        n1 = n2 = 0;
        v1[n1++] = mp(ZERO, ZERO);
        v2[n2++] = mp(ZERO, ZERO);
    }
};

Данная структура данных применяется в следующих задачах:
— рюкзак с ограничением количества элементов. Позволяет решить задачу за O(NW)
— поиск минимума во всевозможных диапозонах массива фиксированной длины (скользящее окно по массиву)

С++ – Минимальное значение в очереди

Вопрос:

У меня очередь из типа struct

struct test {
int numbers;
};

queue<test> q;

как найти минимальное значение:

q.front().numbers;

Например, если в числах 5,1,3 мне нужно найти 1.

Лучший ответ:

Поскольку вам нужна очередь целых чисел, самым простым решением является использование std::deque<int>. Затем вы можете использовать std::min_element чтобы найти минимальный элемент в очереди:

std::deque<int> q{5, 1, 3};
std::deque<int>::iterator it = std::min_element(q.begin(), q.end());
std::cout << *it << std::endl;

Поступая таким образом, вам не нужно использовать struct test. Это особенно верно, так как кажется, что просто хранит целое число. Если, с другой стороны, struct test более сложный (с большим количеством полей), то вы можете использовать точно такой же подход, но определяя функцию сравнения для struct test (см. @Fljx ответ для примера такой функции сравнения).

Если вы можете использовать только queue вы ограничены типом операций, которые вы можете сделать. Поэтому вам нужно будет сделать что-то вроде:

std::queue<int> q;
/* fill queue ... */
int min_value = INT_MAX;
std::size_t size = q.size();
while (size-- > 0) {
    int x = q.front();
    q.pop();
    q.push(x);
    if (x < min_value)
        min_value = x;
}

Ответ №1

Существует множество страниц, объясняющих это в Интернете.

Вам нужно создать operator < указать, как должна сравниваться ваша структура.

struct test {
int numbers;

bool operator < ( const test &t ) const
{ return this->numbers < t.numbers; }
};

(Я не тестировал этот код для какой-либо глупой ошибки, но ссылки ниже могут помочь, если вы найдете какие-либо проблемы).

После этого используйте #include <algorithm> для доступа к min_element().

Ссылки: http://www.cplusplus.com/reference/algorithm/min_element/ http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html

Понравилась статья? Поделить с друзьями:
  • Как найти чем увлечься
  • Как найти человека в кириллове
  • Как найти процент отклонения фактической себестоимости
  • Как исправить нарушения зрения
  • Как начинающему фотографу найти клиентов