Удаление элемента из стека при каждом вызове метода - PullRequest
2 голосов
/ 11 апреля 2010

У меня есть вопрос относительно программы, которая стимулирует стек (без использования каких-либо встроенных функций стека или чего-либо подобного).

stack2= 1 2 3 4 5 //single dimension array of 5 elements

При вызове метода pop стек должен выглядеть следующим образом, в основном, удаляя элемент каждый раз, когда стек вызывается снова.

stack2= 1 2 3 4 0  
stack2= 1 2 3 0 0  
stack2= 1 2 0 0 0  
stack2= 1 0 0 0 0  
stack2= 0 0 0 0 0

Вот мой код:

for (int i = 1; i <= 6; i++)
{
    number= TryPop(s2);
    //use number
    ShowStack(s2, "s2");
}

public void Push(int g)
{
    if (top == Max)
    {
        throw new Exception("Stack overflow...");
    }
    else
    {
        tabel[top] = g;
        top++;
    }
}/*Push*/

У меня уже есть код, который заполняет мой массив значениями (с помощью метода push). Метод pop должен взять последнее значение и поместить его в 0, затем вызвать следующий стек и поместить следующий в 0 (как показано выше в stack2).

Текущий метод pop, который отслеживает верхний индекс (0 элементов = 0 верхний, 1 элемент = 1 верхний и т. Д.), Уже включает предупреждение о недостаточном значении, если оно продолжается 0 или ниже (что правильно).

public int Pop()
{
    if(top <= 0)
    {
        throw new Exception("Stack underflow...");
    }
    else
    {
        for (int j = tabel.Length - 1; j >= 0; j--)  
        {
            //...Really not sure what to do here.
        }
    }

    return number; 

}/*Pop*/

Так как в другом классе у меня уже есть цикл (цикл for, показанный выше), который в 6 раз имитирует стек s2. (первый стек: 1 2 3 4 0, второй стек 1 2 3 0 0 и т. д.) Как именно я снимаю элемент каждый раз? Либо у меня весь дисплей на 0, либо на 0 в неправильных местах / нет индекса ошибок.

Редактировать: Рабочий метод Pop:

public int Pop()
{
    if(top <= 0)
    {
        throw new Exception("Stack underflow...");
    }

    top--;
    tabel[top] = 0;
    number = tabel[top];

    return number;
}/*Pop*/

Ответы [ 5 ]

8 голосов
/ 11 апреля 2010

Чтобы реализовать стек, вам нужен массив и «указатель» на вершину стека.

empty       _ _ _ _ _
            ↑

В вашем коде table - это массив, а top - указатель (как индекс массива).

Нажмите

Чтобы поместить элемент в стек, поместите элемент в верхнюю часть стопки и передвиньте указатель на единицу:

push 1      1 _ _ _ _
              ↑

push 2      1 2 _ _ _
                ↑

push 3      1 2 3 _ _
                  ↑

Вот что делает ваш код:

table[top] = g;    // insert `g` at `top` into `table`
top++;             // advance `top` by one

Поп

Чтобы вытолкнуть элемент, переместите указатель назад на единицу и верните + сотрите элемент сверху:

pop 3       1 2 _ _ _
                ↑

pop 2       1 _ _ _ _
              ↑

pop 1       _ _ _ _ _
            ↑

Теперь попробуйте перевести ваше решение для Push, чтобы сделать обратное, как показано здесь!

1 голос
/ 11 апреля 2010

Вы должны объявить локальную переменную result и установить для нее текущее значение вершины стека, используя top в качестве индекса ваших данных. Затем уменьшите переменную top и верните result. Поскольку это домашнее задание, я не буду публиковать код - вы должны попытаться реализовать его самостоятельно, чтобы убедиться, что вы его понимаете.

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

Следует также отметить, что эта реализация не является поточно-ориентированной. Это нормально, но убедитесь, что это четко задокументировано.

0 голосов
/ 11 апреля 2010

Я уверен, что меня зажигают за то, что он дал ему ответ, но я знаю, чего бы я хотел, если бы я был на его месте в воскресенье Я надеюсь, что ответ dtb получит наибольшее количество голосов, потому что заслуживает его за отличное объяснение стека!

Вот базовый пример стека. Пожалуйста, изучите это. не просто вставьте его в домашнее задание.

public class Stack<T>
{
    public int Count { get; private set; }
    private int _CurrentPosition;
    private T[] _Values;

    public Stack(int capacity)
    {
        _CurrentPosition = -1;
        _Values = new T[capacity];
        Count = capacity;
    }

    public T Peek()
    {
        if (_CurrentPosition < 0)
            return default(T);

        return _Values[_CurrentPosition];
    }

    public void Push(T item)
    {
        if (_CurrentPosition == Count)
            throw new Exception("Stack overflow...");

        _CurrentPosition++;
        _Values[_CurrentPosition] = item;
    }

    public T Pop()
    {
        if(_CurrentPosition < 0)
            throw new Exception("Stack underflow...");
        T item = _Values[_CurrentPosition];
        _Values[_CurrentPosition] = default(T);
        _CurrentPosition--;
        return item;
    }
}
0 голосов
/ 11 апреля 2010

Предполагая, что top ссылается на вершину стека, достаточно установить значение в верхней части стека на 0 и уменьшить вершину.

public int Pop()
{
    if(top < 0)
    {
        throw new Exception("Stack underflow...");
    }
    else
    {
        table[top] = 0;
        top--;
    }

    // not sure where number comes from
    return number; 

}/*Pop*/
0 голосов
/ 11 апреля 2010

Вы не должны использовать цикл for в Pop(). Вы удаляете только один элемент, и вы знаете местоположение этого элемента (он имеет индекс top), поэтому вам нужно иметь дело только с этим элементом стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...