Хорошо, вот одно решение.
Сначала нам нужны некоторые вещи, которые предоставляют push_back (), push_front (), pop_back () и pop_front () в 0 (1). Его легко реализовать с помощью массива и 2 итераторов. Первый итератор будет указывать на фронт, второй на спину. Давайте назовем такой материал deque.
Вот псевдокод:
class MyQueue//Our data structure
{
deque D;//We need 2 deque objects
deque Min;
push(element)//pushing element to MyQueue
{
D.push_back(element);
while(Min.is_not_empty() and Min.back()>element)
Min.pop_back();
Min.push_back(element);
}
pop()//poping MyQueue
{
if(Min.front()==D.front() )
Min.pop_front();
D.pop_front();
}
min()
{
return Min.front();
}
}
Объяснение:
Пример давайте нажимаем числа [12,5,10,7 , 11,19] и нашему MyQueue
1) нажатие 12
D [12]
Min[12]
2) нажатие 5
D[12,5]
Min[5] //5>12 so 12 removed
3) нажатие 10
D[12,5,10]
Min[5,10]
4) нажатие 7
D[12,5,10,7]
Min[5,7]
6) нажатие 11
D[12,5,10,7,11]
Min[5,7,11]
7) нажатие 19
D[12,5,10,7,11,19]
Min[5,7,11,19]
Теперь давайте назовем pop_front ()
, мы получили
D[5,10,7,11,19]
Min[5,7,11,19]
Минимум 5
Давайте снова вызовите pop_front ()
Объяснение : pop_front удалит 5 из D, но также добавит передний элемент из Min, потому что он равен переднему элементу D (5).
D[10,7,11,19]
Min[7,11,19]
И минимально 7.:)