Как поменять местами элементы в стеке в C#?

494
12 сентября 2017, 06:55

Как поменять местами элементы в стеке в C#? Надо ли для этого релизовывать свой стек? Подскажите пожалуйста

Answer 1

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

int smallerIdx = Math.Min(i, j);
int largerIdx = Math.Max(i, j);
Stack<T> aux = new Stack<T>(largerIdx);
T tmp = default;
for (int k = 0; k <= largerIdx; k++)
{
    T curr = stack.Pop();
    aux.Push(curr);
    if (k == smallerIdx)
        tmp = curr;
}
stack.Push(tmp);
tmp = aux.Pop();
for (int k = largerIdx - 1; k >= 0; k--)
{
    T curr = aux.Pop();
    if (k == smallerIdx)
        curr = tmp;
    stack.Push(curr);
}

Обратите внимание, что такой подход жутко неэффективен. Если вам нужны такие операции (доступ по индексу) в вашей программе, то стек, скорее всего, неподходящая структура данных. Но с академическими целями так делать можно.

Answer 2

Если такая задача у вас не единичная — предлагаю реализовать собственный стек с открытым индексатором или методом для перестановки элементов. Исходный код стандартного стека лежит здесь, возьмите его и добавьте в него следующий метод:

public void Swap(int firstIndex, int secondIndex)
{
    // Проверки параметров на допустимость
    ...
    T temp = _array[firstIndex];
    _array[firstIndex] = _array[secondIndex];
    _array[secondIndex] = temp;
}
READ ALSO
Работа с пикселями [требует правки]

Работа с пикселями [требует правки]

Подскажите пожалуйста, как на C# проверить по пикселям картинку с картинками в папке?

320
C# запуск NodeJs через Process

C# запуск NodeJs через Process

Мне нужно запустить nodejs, перехватив его потоки ввода и выводаЯ написал код

332
Плавная графика в C# (Windows Forms)

Плавная графика в C# (Windows Forms)

Пишу свой аналог игры osu!Catch the beatСуть игры в том, что нужно ловить падающие объекты (ну для наглядности лучше загуглить игру)

249
Ошибка 404 kendoui

Ошибка 404 kendoui

Добрый день! Приложение на локальном компе работает идеальноНо на IIS 8 ошибка вылезает типа:

318