2010-04-10 3 views
2

Обратите внимание, что ограничений по памяти нет. мне нужно вставить Int от 1 до 1000.Какова будет структура данных в следующем сценарии? (Stack with maximum)

я могу сделать каждый из следующих операций в постоянного порядка времени:

  1. нажимной(): добавляет к началу
  2. поп(): удаляет верхний элемент
  3. getMax(): возвращает максимальный элемент

Пожалуйста, предложите мне подходящую структуру данных.

+1

Звучит как домашнее задание. Где ваши собственные усилия? –

+0

Дайте нам определение того, что должен сделать этот getMax –

+0

@Coronatus это было предложено мне в интервью, и я не смог ответить на него. Итак, я ищу ответ –

ответ

3

Поскольку нет ограничений на память, я буду использовать 2 вектора - один для фактических данных в стеке, а другой для отслеживания max в каждом состоянии стека.
Для простоты я предполагаю, что этот стек содержит только + ve ints.
Я знаю, что это не проверка ошибок. Но я просто предлагаю идею структуры данных здесь, а не полноценное решение.

class StackWithMax 
{ 
public: 
    StackWithMax() : top(-1), currentMax(0) { } 
    void push(int x); 
    int pop(); 
    int getMax() { return m[top]; } 
private: 
    vector<int> v; // to store the actual elements 
    vector<int> m; // to store the max element at each state 
    int top; 
    int currentMax; 
}; 

void StackWithMax::push(int x) 
{ 
    v[++top] = x; 
    m[top] = max(x, currentMax); 
} 

int StackWithMax::pop() 
{ 
    int x = v[top--]; 
    currentMax = m[top]; 
    return x; 
} 
+0

Вам также нужно что-то сделать для 'm' во время поп-музыки, не так ли? +1, во всяком случае. – 2010-05-28 03:57:39

+0

@Moron: Спасибо, что указали это. Теперь я изменил 'pop()'. – AngryWhenHungry

-1

Используйте обычную структуру стека и дополнительный массив для счетчиков int c[1..1000] и переменной int maxVal=0.

В коде добавить действий после операций стеки:

On push(x) -> c[x]++ ; maxVal = max(x,maxVal) 
On pop():x -> c[x]-- ; if (c[x] == 0) { j=x; while(c[--j] == 0); maxVal = j; } 

MAXVAL должен всегда максимальное значение.

Возможно, я ошибаюсь, это должно было амортизировать вычислительную сложность O (1). Прошло много времени с тех пор, как я анализировал алгоритмы.

+0

Это неверно. Каждое вышеописанное действие должно выполняться в постоянном порядке. –