1. 程式人生 > >1. 棧和佇列的陣列實現

1. 棧和佇列的陣列實現

  • 用陣列實現一個棧

    棧頂元素下標index與其對應的陣列元素下標f(index)之間的對映關係是怎樣的?隨著棧的增長,棧頂元素下標依次為0,1,2...n-1,其中n表示棧的最大高度。我們需要制定一種對映規則f,方便我們通過index計算出f(index)。而最簡單的規則就是f(index) = index。

    都需要記錄哪些資訊?陣列本身的指標p、總長度SIZE,以及棧頂元素下標index。

#include<iostream>
template<typename Object>
class Stack
{
public:
    Stack()
    {
        init();
    }
    Stack(const Stack& rhs)
    {
        init();
        index = rhs.index;
        for(int i = 0; i != index + 1; ++i)
            p[i] = rhs.p[i];
    }

    Stack(Stack&& rhs):p(rhs.p),index(rhs.index)
    {
        rhs.p = nullptr;
        rhs.index = -1;
    }

    Stack& operator =(const Stack& rhs)
    {
        Stack copy(rhs);
        std::swap(p, copy.p);
        std::swap(index, copy.index);
        return *this;
    }

    Stack& operator =(Stack&& rhs)
    {
        std::swap(p, rhs.p);
        std::swap(index, rhs.index);
        return *this;
    }

    ~Stack()
    {
        if(p)
            delete[] p;
    }

    void push(const Object& object)
    {
        if(index == MAX_SIZE-1)
            std::cerr << "overflow" << std::endl;
        else
            p[++index] = object;
    }

    void push(Object&& object)
    {
        if(index == MAX_SIZE-1)
            std::cerr << "overflow" << std::endl;
        else
            p[++index] = std::move(object);
    }
    void pop()
    {
        if(empty())
            std::cerr << "underflow" << std::endl;
        else
            --index;
    }
    Object& top()
    {
        return p[index];
    }
    const Object& top() const
    {
        return p[index];
    }
    bool empty() const
    {
        return index == -1;
    }
private:
    static constexpr int MAX_SIZE = 4;
    Object* p;
    int     index;

    void init()
    {
        p = new Object[MAX_SIZE];
        index = -1;
    }
};