Он «выталкивает» нижний элемент стека, временно сохраняя элемент до тех пор, пока он не достигнет дна, а затем возвращает их обратно при возврате рекурсивных вызовов.
Удалите один элемент и сохраните его для дальнейшего использования:
int x = showtop()->data;
pop();
Если это был нижний элемент, верните его:
if (isempty()){
return x;
}
В противном случае, пусть рекурсивный вызов удалит нижний элемент и передаст нам:
int item = deQueue();
Теперь в стеке находятся все элементы, кроме нижнего (item
) и того, который мы удалили (x
), поэтому мы помещаем тот, который мы удалили, сверху:
push(x);
и передать нижний элемент, который мы получили из рекурсии:
return item;
Я подозреваю, что вас сбивает с толку то, что deQueue
может вернуть значение для предыдущего вызова на deQueue
, а не на main
.
(Возвращение из рекурсии не похоже на выход из al oop.)
Более конкретно, если ваша очередь
1 2 3
Первый вызов сначала сохранит 1
в x
, затем recurse (теперь стек 2 3
).
Второй вызов s tores 2
в его x
и рекурсах (3
).
Третий вызов удаляет 3
, оставляя пустой стек, и возвращает 3
вызывающей стороне.
Второй вызов затем возвращает назад 2
, который он принял, и возвращает 3
(2
).
Затем первый вызов возвращает 1
и также возвращает 3
(1 2
).