Il existe une solution plus créative sans utiliser de pile auxiliaire.
Supposant que nous allons pousser un certain nombre valeur dans une pile avec un nombre minimum min. Si la valeur est supérieure ou égale à min, elle est poussée directement dans la pile de données. Si elle est inférieure à min, nous poussons 2 * valeur-min et mettre à jour min comme valeur depuis un nouveau minimum est poussé.
Que diriez-vous de pop?Nous le sautons directement si le sommet de la pile de données (noté top) est supérieur ou égal à min. Sinon, le numéro top n'est pas le nombre réellement poussé. Le vrai nombre poussé est stocké sous min. Après que le nombre minimum actuel est sorti, nous devons restaurer le nombre minimum précédent, qui est 2 * min - * top *.
Maintenant, nous allons démontrer son exactitude de cette solution. Lorsque valeur est supérieure ou égale à min, il est poussé dans la pile de données directe sans mettre à jour min. Par conséquent, lorsque nous constatons que le sommet de la pile de données est supérieur ou égal à min, nous pouvons afficher directement sans mettre à jour min. Cependant, si nous trouvons valeur est moins alors min, nous poussons 2 * valeur - * min *. Nous devrions remarquer que la valeur 2 * - * min * est inférieure à valeur. Ensuite, nous mettons à jour le courant min comme valeur. Par conséquent, le nouveau sommet de la pile de données (top) est inférieur à l'actuel min. Par conséquent, lorsque nous constatons que le sommet de la pile de données est inférieur à min, le réel supérieur (réel poussé numéro valeur) est stocké dans min. Après avoir déplacé le haut de la pile de données, nous devons restaurer le nombre minimum précédent. Depuis haut = 2 * valeur -Précédent min et valeur est en cours min, min drainant est 2 * Courant min-top.
code exemple du C est indiqué ci-dessous:
template <typename T> class StackWithMin {
public:
StackWithMin(void) {}
virtual ~StackWithMin(void) {}
T& top(void);
void push(const T& value);
void pop(void);
const T& min(void) const;
private:
std::stack<T> m_data; // data stack, to store numbers
T m_min; // minimum number
};
template <typename T> void StackWithMin<T>::push(const T& value) {
if(m_data.size() == 0) {
m_data.push(value);
m_min = value;
}
else if(value >= m_min) {
m_data.push(value);
}
else {
m_data.push(2 * value - m_min);
m_min = value;
}
}
template <typename T> void StackWithMin<T>::pop() {
assert(m_data.size() > 0);
if(m_data.top() < m_min)
m_min = 2 * m_min - m_data.top();
m_data.pop();
}
template <typename T> const T& StackWithMin<T>::min() const {
assert(m_data.size() > 0);
return m_min;
}
template <typename T> T& StackWithMin<T>::top() {
T top = m_data.top();
if(top < m_min)
top = m_min;
return top;
}
Cette solution est empruntée à my blog, et mon livre "Coding Interviews: Questions, Analysis & Solutions".
duplication possible de [Pile avec find-min/find-max plus efficace que O (n)?] (Http://stackoverflow.com/questions/7134129/stack-with-find-min-find-max- plus-efficace-que-sur) – templatetypedef