С++ для начинающих

         

Вернемся в классу iStack


У класса iStack, разработанного нами в разделе 4.15, два недостатка:

  • он поддерживает только тип int. Мы хотим обеспечить поддержку любых типов. Это можно сделать, преобразовав наш класс в шаблон класса Stack;
  • он имеет фиксированную длину. Это неудобно в двух отношениях: заполненный стек становится бесполезным, а в попытке избежать этого мы окажемся перед необходимостью отвести ему изначально слишком много памяти. Разумным выходом будет разрешить динамический рост стека. Это можно сделать, пользуясь тем, что лежащий в основе стека вектор способен динамически расти.
  • Напомним определение нашего класса iStack:

    #include <vector>

    class iStack {

    public:

        iStack( int capacity )

                  : _stack( capacity ), _top( 0 ) {};

        bool pop( int &value );

        bool push( int value );

        bool full();

        bool empty();

        void display();

        int size();

    private:

        int _top;

        vector< int > _stack;

    };

    Сначала реализуем динамическое выделение памяти. Тогда вместо использования индекса при вставке и удалении элемента нам нужно будет применять соответствующие функции-члены. Член _top больше не нужен: функции push_back() и pop_back() автоматически работают в конце массива. Вот модифицированный текст функций pop() и push():

    bool iStack::pop( int &top_value )

    {

        if ( empty() )

            return false;

        top_value = _stack.back(); _stack.pop_back();

        return true;

    }

    bool iStack::push( int value )

    {

        if ( full() )

            return false;

        _stack.push_back( value );

        return true;

    }

    Функции-члены empty(), size() и full() также нуждаются в изменении: в этой версии они теснее связаны с лежащим в основе стека вектором.

    inline bool iStack::empty(){ return _stack.empty(); }

    inline bool iStack::size() { return _stack.size(); }

    inline bool iStack::full() {

        return _stack.max_size() == _stack.size();   }

    Надо немного изменить функцию-член display(), чтобы _top больше не фигурировал в качестве граничного условия цикла.




    Содержание  Назад  Вперед