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

1 / 1 / 0

Регистрация: 04.06.2015

Сообщений: 22

1

31.05.2016, 22:38. Показов 8905. Ответов 9


Студворк — интернет-сервис помощи студентам

Доброго времени суток. Задание создать консольное приложение и «Найти максимальный элемент очереди или стека вставить после него «0»». Массив использовать нельзя, делать через промежуточный стек или очередь. Вопрос — как сравнить элементы очереди. не надо целиком рабочую программу, подскажите куда думать.



0



Администратор

Эксперт .NET

15581 / 12553 / 4986

Регистрация: 17.03.2014

Сообщений: 25,485

Записей в блоге: 1

01.06.2016, 06:36

2

Dla12, используй тот факт что если выбрать очередной элемент из очереди (Dequeue) или стека (Pop) и поместить его в другую очередь или стек, ты получишь тот же порядок элементов. При этом ты переберешь все элементы и значит сможешь найти максимальное значение.



0



1 / 1 / 0

Регистрация: 04.06.2015

Сообщений: 22

01.06.2016, 13:11

 [ТС]

3

OwenGlendower, зто понятно, я так и пытался сделать, а вот как их сравнить?



0



OwenGlendower

Администратор

Эксперт .NET

15581 / 12553 / 4986

Регистрация: 17.03.2014

Сообщений: 25,485

Записей в блоге: 1

01.06.2016, 13:31

4

Лучший ответ Сообщение было отмечено Dla12 как решение

Решение

Dla12, а как бы мы сравнивали элементы обычного массива? По очереди. Здесь тоже самое.

C#
1
2
3
4
5
6
7
var q = new Queue<int>(Enumerable.Range(1, 10));
int max = int.MinValue;
while (q.Count > 0)
{
    int n = q.Dequeue();
    if (n > max) max = n;
}



1



1 / 1 / 0

Регистрация: 04.06.2015

Сообщений: 22

01.06.2016, 14:21

 [ТС]

5

Цитата
Сообщение от OwenGlendower
Посмотреть сообщение

а как бы мы сравнивали элементы обычного массива? По очереди. Здесь тоже самое.

Я строку заполняю с клавиатуры, в вашем вариант выдает ошибку: Наиболее подходящий перегруженный метод … имеет несколько недопустимых аргументов.
а в моем : Не удается неявно преобразовать object в int.



0



Администратор

Эксперт .NET

15581 / 12553 / 4986

Регистрация: 17.03.2014

Сообщений: 25,485

Записей в блоге: 1

01.06.2016, 14:42

6

Dla12, добавь преобразование из строки в число используя int.Parse(string) или Convert.ToInt32(string).



1



Dla12

1 / 1 / 0

Регистрация: 04.06.2015

Сообщений: 22

02.06.2016, 11:26

 [ТС]

7

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
static void Main(string[] args)
        {
            Console.WriteLine("Введите количество элементов");
            int n = Convert.ToInt32(Console.ReadLine());
            Queue q = new Queue(n);
            Queue q1 = new Queue();
            int max = int.MinValue;
            int a, b = 0;
            int elm;
            for (int i = 0; i < n; i++)
            {
                Console.WriteLine("Введите элемент № " + i);
                elm = Convert.ToInt32(Console.ReadLine());
                q.Enqueue(elm);
            }           
                
            while (q.Count > 0)             //перемещает все элементы 
                {                           //во 2 очередь, переменной max
                    a = (int)q.Dequeue();   //присваиваится значение максимального элемента
                    if (a > max)
                    {
                        max = a;
                        q1.Enqueue(a);
                    }
                    else
                        q1.Enqueue(a);
 
                }           
 
            while (q1.Count > 0)         //перемещает все элементы в 1очередь,  
            {                            //добавляет 0 после максимального элемента
                b = (int)q1.Dequeue();
                if (b == max)
                {
                    q.Enqueue(b);
                    q.Enqueue(0);                   
                }
                else
                {
                    q.Enqueue(b);
                }
                while(q.Count > 0)
                Console.Write(q.Dequeue());
            }
            Console.ReadKey();
        }
    }

Как то так спасибо.



1



OwenGlendower

Администратор

Эксперт .NET

15581 / 12553 / 4986

Регистрация: 17.03.2014

Сообщений: 25,485

Записей в блоге: 1

02.06.2016, 11:33

8

Лучший ответ Сообщение было отмечено Dla12 как решение

Решение

Dla12, лучше так:

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
static void Main(string[] args)
{
    Console.WriteLine("Введите количество элементов");
    int n = Convert.ToInt32(Console.ReadLine());
    
    Queue<int> q = new Queue<int>(n);
    for (int i = 0; i < n; i++)
    {
        Console.WriteLine("Введите элемент № " + i);
        int elm = Convert.ToInt32(Console.ReadLine());
        q.Enqueue(elm);
    }           
    
    Queue<int> q1 = new Queue<int>();
    int max = int.MinValue;
    while (q.Count > 0)
    {
        int elm = q.Dequeue();
        if (elm > max) max = elm;
        q1.Enqueue(elm);
    }           
    
    while (q1.Count > 0)
    {
        int elm = q1.Dequeue();
        q.Enqueue(elm);    
        if (elm == max) q.Enqueue(0);
    }
    
    while (q.Count > 0) Console.Write("{0} ", q.Dequeue());
}



2



1 / 1 / 0

Регистрация: 04.06.2015

Сообщений: 22

03.06.2016, 19:41

 [ТС]

9

Цитата
Сообщение от OwenGlendower
Посмотреть сообщение

лучше так:

Опыт страшная сила
Спасибо. за советы.



0



0 / 0 / 0

Регистрация: 13.03.2017

Сообщений: 29

04.11.2017, 17:51

10

не подскажите пожалуйста, как минимальный элемент найти? а то, что-то не получается…



0



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

Добрый день. Помогите отыскать ошибку в коде. Нужно написать функцию-шаблон для поиска максимального элемента в очереди (элементы очереди отличаются типами данных). Написал функцию, но выкидывает не совсем понятные ошибки, касающиеся функции findMax(). Только начал осваивать эту тему, самостоятельно не получилось разобраться. Заранее спасибо за помощь.

#include <iostream>
#include <queue>
using namespace std;

template <typename T>
void fillArray(queue<T> &arr)
{
    T el;
    int size;
    cout << "Enter the number of elements: ";
    cin >> size;
    for (int i = 0; i < size; i++)
    {
        cin >> el;
        arr.push(el);
    }
}

template <typename T>
T findMax(queue<T> arr)
{
    T maxValue = arr[0];
    for (int i = 1; i < arr.size(); i++)
    {
        if (arr[i] > maxValue)
        {
            maxValue = arr[i];
        }
    }
    return maxValue;
}


int main()
{
    queue<int> IntArr;
    queue<double> doubleArr;

    fillArray(IntArr);
    fillArray(doubleArr);
    cout << "Max in IntArr: " << findMax(IntArr) << endl;
    cout << "Max in DoubleArr: " << findMax(doubleArr) << endl;

    system("pause");
    return 0;
}

Harry's user avatar

Harry

214k15 золотых знаков117 серебряных знаков229 бронзовых знаков

задан 15 апр 2018 в 7:37

Jack132's user avatar

4

У очереди НЕТ возможности обращения к элементам наподобие arr[i].

Так что, по большому счету, найти максимальный элемент в очереди можно только вынимая элемент в начале очереди, сравнивая и ставя его снова в конец очереди…

Ну, или, раз уж вы передаете очередь не по ссылке, а по значению:

T findMax(queue<T> arr)

то все равно это копия, так что можно просто выбрать из очереди все элементы для поиска максимального, не возвращая их в очередь.

ответ дан 15 апр 2018 в 7:43

Harry's user avatar

HarryHarry

214k15 золотых знаков117 серебряных знаков229 бронзовых знаков

Формулировка задачи:

Доброго времени суток. Задание создать консольное приложение и «Найти максимальный элемент очереди или стека вставить после него «0»». Массив использовать нельзя, делать через промежуточный стек или очередь. Вопрос — как сравнить элементы очереди. не надо целиком рабочую программу, подскажите куда думать.

Код к задаче: «Найти максимальный элемент Очереди (Queue) и вставить после него «0»»

textual

static void Main(string[] args)
{
    Console.WriteLine("Введите количество элементов");
    int n = Convert.ToInt32(Console.ReadLine());
    
    Queue<int> q = new Queue<int>(n);
    for (int i = 0; i < n; i++)
    {
        Console.WriteLine("Введите элемент № " + i);
        int elm = Convert.ToInt32(Console.ReadLine());
        q.Enqueue(elm);
    }           
    
    Queue<int> q1 = new Queue<int>();
    int max = int.MinValue;
    while (q.Count > 0)
    {
        int elm = q.Dequeue();
        if (elm > max) max = elm;
        q1.Enqueue(elm);
    }           
    
    while (q1.Count > 0)
    {
        int elm = q1.Dequeue();
        q.Enqueue(elm);    
        if (elm == max) q.Enqueue(0);
    }
    
    while (q.Count > 0) Console.Write("{0} ", q.Dequeue());
}

Полезно ли:

13   голосов , оценка 4.308 из 5

#java #algorithm #data-structures #queue

Вопрос:

Дан массив A и целое число K. Мы должны найти максимальный элемент во всех смежных подмножествах размера K, используя только очередь в JAVA.

Например:

 Input:
7 3
12 1 78 90 57 89 56

Output:
78 90 90 90 89
 

Как я могу решить эту проблему, используя только очередь на Java?

Комментарии:

1. дан массив и целое число, …, решите его, используя только очередь . Какая очередь? Что ты пробовал, где ты застрял? Пожалуйста, выберите один язык

2. Я могу решить эту проблему с помощью deque…Но я пытаюсь решить ее только с помощью очередей.

3. Вам понадобится функция, которая возвращает максимальный элемент в данной очереди. Затем вы создаете очередь и заполняете ее первыми K элементами вашего списка. После печати макса (с помощью первоначально упомянутой функции) вы отбрасываете первый элемент и добавляете новый. Повторяйте до тех пор, пока у вас не останется новых элементов.

Ответ №1:

Вы можете использовать Sliding Window технику, чтобы найти максимальный элемент во всех смежных подмассивах размера K .
Для этого нам нужно использовать a PriorityQueue , чтобы мы могли получить максимальный элемент определенного окна в постоянное время. Во-первых, добавьте все первые K элементы в очередь и верните первый максимум, затем выполните итерацию по остальным окнам/суб-массивам размера K , просто добавив новую головку и удалив хвост окна.
И на каждой итерации продолжайте возвращать peek (максимум) текущего окна.
Вот реализация:

 PriorityQueue<Integer> queue = 
new PriorityQueue<>(Collections.reverseOrder());
 
for (int i=0; i < K; i  )
    queue.add(arr[i]);
 
System.out.println(queue.peek()); // maximum element among first `K` elements
 
// Rest of the windows of size `K`
for (int i=K; i < N; i  )
{
    queue.remove(arr[i - K]); // first element from front
    queue.add(arr[i]);       // adding current element
    System.out.println(queue.peek()); // maximum element in current window
}
 

Комментарии:

1. Требуется ли для этого, чтобы целые числа были уникальными?

2. @Surt Нет, он также отлично будет работать с массивом с дубликатами.

3. PriorityQueue.remove(Object o) то есть занимает линейное (по размеру очереди) время O(K) . Это не лучше, чем сканировать окно в поисках элемента max.

4. @user58697 Да, это O(N*K) так, но, пожалуйста, прочитайте вопрос еще раз. ОП строго упомянул, что ему нужен подход, использующий только очередь . Насколько мне известно, это лучшая временная сложность, которую мы можем достичь, если используем очередь. O(N) возможно, если мы используем a deque , которое он уже знает. Если у вас есть более эффективный подход с использованием очереди, пожалуйста, поделитесь своей идеей.

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