1. 棧和佇列的陣列實現
阿新 • • 發佈:2018-12-24
用陣列實現一個棧
棧頂元素下標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; } };