2013-12-24 2 views
2

Это может показаться ошибкой. Рассмотрим следующий пример: stack order: skip skip matchЯвляется ли новый стек <T> (curStack) возвращает обратный стек?

... потом:
stack order: match skip skip

После этого некоторые проверки, я нашел this answer as to some 'reversal' in stack order.

Не было бы правильным ожидать, что второй стек будет в том же порядке, что и оригинал?
Это ошибка?

+0

Я понятия не имею, что означают эти скриншоты. Подумайте о создании [минимального тестового сценария] (http://sscce.org) для изучения/демонстрации того, о чем вы говорите ... –

+0

Не совсем понятно вопрос из приведенных данных. – edtheprogrammerguy

ответ

6

Нет, это не ошибка.

В стек сначала будет добавлен последний добавленный элемент. Поэтому, когда вы переходите к заполнению нового стека, сначала добавляете новый элемент. Поскольку этот элемент добавлен сначала, он теперь будет «самым старым» элементом в новом стеке, хотя это был «самый новый» элемент в старом стеке.

Восстанавливается полностью ожидаемое поведение.

Если у вас была очередь, то запись var newQueue = new Queue<T>(oldQueue); фактически создаст копию. Очереди дают самый старый предмет, поэтому самый старый элемент в старой очереди становится самым старым элементом в новой очереди. То же самое относится и к списку.

У вас, похоже, создается впечатление, что существует какой-то конструктор копирования, в котором стек занимает еще один стек и делает копию. Это неверно, он просто принимает IEnumerable<T> в качестве своего ввода. Для List и Queue это приводит к копированию, так как стеки просто влияют на реверсирование элементов.

2

Это по дизайну.

Обратите внимание, что constructor overload of Stack<T>, что вы используете, есть IEnumerable<T>. Способ, которым он работает, заключается в повторении по IEnumarable<T> и добавлении элементов в стек.

Теперь, если вы используете параметр Stack<T>. Предполагается, что путь IEnumerable<T> будет вести себя, указав элементы в том порядке, в котором они появятся, когда вы возьмете их из стека (это LIFO: Last-In First-Out).

Таким образом, на самом деле эти операции, как ожидается, будут отменять стек.

Смежные вопросы