From a18c6ba5d4d55245590c5ec95b48234d01e7ea9b Mon Sep 17 00:00:00 2001 From: e2hang <2099307493@qq.com> Date: Mon, 21 Jul 2025 17:08:57 +0800 Subject: [PATCH] chainStack --- Stack/chainStack/chainStack.h | 127 ++++++++++++++++++++++++++++++++++ Stack/chainStack/main.cpp | 42 +++++++++++ Stack/chainStack/node.h | 24 +++++++ Stack/chainStack/stack.h | 13 ++++ 4 files changed, 206 insertions(+) create mode 100644 Stack/chainStack/chainStack.h create mode 100644 Stack/chainStack/main.cpp create mode 100644 Stack/chainStack/node.h create mode 100644 Stack/chainStack/stack.h diff --git a/Stack/chainStack/chainStack.h b/Stack/chainStack/chainStack.h new file mode 100644 index 0000000..00ebe58 --- /dev/null +++ b/Stack/chainStack/chainStack.h @@ -0,0 +1,127 @@ +#ifndef CHAIN_STACKH +#define CHAIN_STACKH +#include +#include "stack.h" +#include "node.h" + +template +class chainStack : public Stack{ +private: + Node* first; + Node* last; + int stackTop; +public: + chainStack() = delete; + chainStack(Node* f = nullptr); + chainStack(const chainStack& x); + virtual bool empty() const; + virtual int size() const; + virtual T& top(); + virtual void pop(); + virtual void push(const T& theElement); + virtual void show() const; + ~chainStack(); +}; + +template +inline chainStack::chainStack(Node* f) :first(f), stackTop(0), last(nullptr) { + Node* p = first; + while (p) { + ++stackTop; + p = p->next; + } +} + +template +inline chainStack::chainStack(const chainStack& x) +{ + Node* run = x.first; + Node* tnext = nullptr; + Node* tprev = nullptr; + while (run) { + Node* tmp = new Node(run->element, tprev, tnext); + if(tprev) tprev->next = tmp; + if (!tprev) first = tmp; + tprev = tmp; + run = run->next; + } + last = tprev; +} + +template +inline bool chainStack::empty() const +{ + return (stackTop == 0); +} + +template +inline int chainStack::size() const +{ + return stackTop; +} + +template +inline T& chainStack::top() +{ + return last->element; +} + +template +inline void chainStack::pop() +{ + if (stackTop == 0) + throw std::invalid_argument("Pop Error: No Element in Stack"); + if (last) { + Node* tmp = last; + last = last->prev; + if (last) { + last->next = nullptr; + } + else { + first = nullptr; + } + delete tmp; + stackTop--; + } +} + + +template +inline void chainStack::push(const T& theElement) { + Node* tmp = new Node(theElement, last, nullptr); + if (last) last->next = tmp; + else first = tmp; + last = tmp; + stackTop++; +} + + +template +inline void chainStack::show() const { + Node* p = first; + while (p) { + std::cout << p->element << " "; + p = p->next; + } + std::cout << std::endl; +} + +template +inline chainStack::~chainStack() +{ + Node* p = first; + Node* that; + while (p) { + that = p; + p = that->next; + delete that; + } + first = nullptr; + last = nullptr; + stackTop = 0; +} + + + + +#endif // !CHAIN_STACKH diff --git a/Stack/chainStack/main.cpp b/Stack/chainStack/main.cpp new file mode 100644 index 0000000..354f18b --- /dev/null +++ b/Stack/chainStack/main.cpp @@ -0,0 +1,42 @@ +#include +#include "node.h" +#include "stack.h" +#include "chainStack.h" +using namespace std; +/* +TO TEST: +private: + Node* first; + Node* last; + int stackTop; +public: + chainStack() = delete; + chainStack(Node* f = nullptr); + chainStack(const chainStack& x); + virtual bool empty() const; + virtual int size() const; + virtual T& top(); + virtual void pop(); + virtual void push(const T& theElement); + virtual void show() const; + ~chainStack() +*/ + +int main() { + chainStack s(nullptr); + s.push('a'); + s.show(); + s.push('b'); + s.show(); + s.push('z'); + s.show(); + s.pop(); + s.show(); + return 0; +} +/* +a +a b +a b z +a b +*/ \ No newline at end of file diff --git a/Stack/chainStack/node.h b/Stack/chainStack/node.h new file mode 100644 index 0000000..b337ea5 --- /dev/null +++ b/Stack/chainStack/node.h @@ -0,0 +1,24 @@ +#pragma once + +template +class Node { +public: + T element; + Node* next; + Node* prev; + +public: + Node(); // 默认构造 + Node(const T& e, Node* n = nullptr, Node* p = nullptr); // 带参数构造 + Node(const Node& x); // 拷贝构造(浅拷贝) + ~Node() = default; +}; + +template +Node::Node() : element(), next(nullptr) , prev(nullptr){} + +template +Node::Node(const T& e, Node* n, Node* p) : element(e), next(p), prev(n){} + +template +Node::Node(const Node& x) : element(x.element), next(nullptr), prev(nullptr){} diff --git a/Stack/chainStack/stack.h b/Stack/chainStack/stack.h new file mode 100644 index 0000000..9eaabbb --- /dev/null +++ b/Stack/chainStack/stack.h @@ -0,0 +1,13 @@ +#pragma once + +template +class Stack { +public: + virtual ~Stack() = default; + 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; + virtual void show() const = 0; +}; \ No newline at end of file