реализация стека (через вложенные классы) - PullRequest
1 голос
/ 03 сентября 2011

Я не уверен, правильно ли я понимаю, как работает этот класс. Это пример стека.

ref class Stack
{
   private:

      ref struct Item // Defines items to store in the stack
      {
         Object^ Obj; // Handle for the object in this item
         Item^ Next; // Handle for next item in the stack or nullptr

         Item(Object^ obj, Item^ next): Obj(obj), Next(next){} // Constructor
      };

      Item^ Top; // Handle for item that is at the top

   public:

      void Push(Object^ obj) // Push an object onto the stack
      {
         Top = gcnew Item(obj, Top); // Create new item and make it the top
      }

      Object^ Pop() // Pop an object off the stack
      {
         if(Top == nullptr) // If the stack is empty
         return nullptr; // return nullptr
         Object^ obj = Top->Obj; // Get object from item
         Top = Top->Next; // Make next item the top
         return obj;
      }
};

Я не могу понять, как именно работает функция Push. в определении класса это Top=gcnew Item(obj, Top), поэтому в основном говорится, что Top равно Next. Так как же класс Stack определяет элемент Next, если он всегда находится на вершине стека?

1 Ответ

1 голос
/ 03 сентября 2011

Я думаю, что вы неверно истолковали строку:

     Top = gcnew Item(obj, Top);

Это означает:

  • сделать новый элемент вершиной стека (что, в конечном итоге, и нужно для стека)
  • набор Next нового предмета к тому, что было ранее вершиной

поэтому, позвонив по номеру Top->Next, вы перейдете к предыдущему элементу (тот, что "под" Top)

...