2016-01-26 1 views
2

Я работал над одной из проблем алгоритмов на Leetcode, и я узнал, что эти две разные функции pop() дают мне разные результаты. (конечно, один из них не работает) Я не понимаю, в чем разница. Почему создание int будет работать, а другое - нет?Stack pop function

public void pop() { 
    if (minStack.peek() == mainStack.pop()) { 
    minStack.pop(); 
    } 
} 

и

public void pop() { 
    int popValue = mainStack.pop(); 
    if (minStack.peek() == popValue) { 
    minStack.pop(); 
    } 
} 
+0

Существуют ли конечные значения, которые мы можем видеть для обеих версий поп()? –

ответ

2

Разница заключается в указателе.

Как только элемент выталкивается из стека, указатель перемещается в следующий элемент в стеке. В этом случае первый код заглядывает первым, а затем появляется, а второй - первым, а затем пытается заглянуть.

Если вы посмотрите на https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html вы увидите, что когда pop() называется (даже если это в if заявление), то появится этот элемент и переместить указатель на следующий элемент.

+0

поэтому, когда я делаю mainStack.pop() в выражении if, я не оцениваю элемент, который был выбит, вместо этого я оцениваю следующий элемент в стеке? –

2

Если вы расшириться выражение в ступеньках разрешения, это то, что делает первый один:

public void pop() { 
    int a = minStack.peek(); 
    int b = mainStack.pop(); 
    boolean e = (a == b); 
    if (e) { 
    minStack.pop(); 
    } 
} 

И это то, что делает второй один:

public void pop() { 
    int a = mainStack.pop(); 
    int b = minStack.peek(); 
    boolean e = (a == b); 
    if (e) { 
    minStack.pop(); 
    } 
} 

Ваш первый пример кода evalutes заглядывает первым и сравнивает его с pop, поэтому он сравнивает верхний элемент с самим собой. Вторая делает поп, а затем заглядывает, сравнивая два разных элемента.

Попробуйте запустить отладчик и проверки списка после каждого шага

+0

Означает ли это, что этот порядок имеет значение? потому что я использую peek для minStack и pop для mainStack. Я не вижу разницы между этими двумя, кроме того, что объявляется первым. –