diff --git a/Stack/arrayStack/arraystack.h b/Stack/arrayStack/arraystack.h new file mode 100644 index 0000000..5e43c81 --- /dev/null +++ b/Stack/arrayStack/arraystack.h @@ -0,0 +1,47 @@ +#pragma once +#include "stack.h" +#include + +template +class arrayStack : public Stack { +private: + T* stack; + int stackTop; + int length; +public: + arrayStack(int initialCapacity = 10); + virtual ~Stack() { delete[] stack; } + + virtual bool empty() const override { return stackTop == -1; } + virtual int size() const override { return stackTop + 1; } + virtual T& top() override; + virtual void pop() override; + virtual void push(const T& theElement) override; +}; + +template +arrayStack::arrayStack(int initialCapacity) { + length = initialCapacity; +} + + +template +T& arrayStack::top() { + if (stackTop == -1) throw std::invalid_argument("No Element in Stack"); + return stack[stackTop]; +} + +template +void arrayStack::pop() { + if (stackTop == -1) throw std::invalid_argument("Empty Stack"); + if constexpr (!std::is_trivially_destructible::value) { + stack[stackTop].~T(); // 只有在 T 有析构函数时才调用 + } + stackTop--; +} + +template +void arrayStack::push(const T& theElement) { + +} + diff --git a/Stack/arrayStack/stack.h b/Stack/arrayStack/stack.h new file mode 100644 index 0000000..0ae7088 --- /dev/null +++ b/Stack/arrayStack/stack.h @@ -0,0 +1,12 @@ +#pragma once + +template +class Stack { +public: + virtual ~Stack(); + virtual bool empty() const = 0; + virtual int size() const = 0; + virtual T& top() = 0; + virtual void pop() = 0; + virtual void push(const T& theElement) = 0; +}; \ No newline at end of file