This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub noshi91/Library
#include <cassert> #include <memory> #include <utility> template <class T> class persistent_stack { using Self = persistent_stack<T>; class node_type; using node_ptr = std::shared_ptr<const node_type>; class node_type { public: T value; node_ptr next; node_type(T value, node_ptr next) : value(value), next(next) {} }; node_ptr root; persistent_stack(node_ptr root) : root(root) {} public: persistent_stack() = default; bool empty() const { return not root; } T top() const { assert(not empty()); return root->value; } Self push(T x) const { return Self(std::make_shared<const node_type>(x, root)); } Self pop() const { assert(not empty()); return Self(root->next); } Self reverse() const { Self ret; Self x = *this; while (not x.empty()) { ret = ret.push(x.top()); x = x.pop(); } return ret; } }; /** * @brief Persistent Stack */
#line 1 "data_structure/persistent_stack.cpp" #include <cassert> #include <memory> #include <utility> template <class T> class persistent_stack { using Self = persistent_stack<T>; class node_type; using node_ptr = std::shared_ptr<const node_type>; class node_type { public: T value; node_ptr next; node_type(T value, node_ptr next) : value(value), next(next) {} }; node_ptr root; persistent_stack(node_ptr root) : root(root) {} public: persistent_stack() = default; bool empty() const { return not root; } T top() const { assert(not empty()); return root->value; } Self push(T x) const { return Self(std::make_shared<const node_type>(x, root)); } Self pop() const { assert(not empty()); return Self(root->next); } Self reverse() const { Self ret; Self x = *this; while (not x.empty()) { ret = ret.push(x.top()); x = x.pop(); } return ret; } }; /** * @brief Persistent Stack */