Advertisement
Guest User

Untitled

a guest
Jul 26th, 2016
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.68 KB | None | 0 0
  1. #ifndef _TOP_HPP
  2. #define _TOP_HPP
  3.  
  4. #include<memory>
  5. #include<iostream>
  6. #include<cstring>
  7.  
  8.     template <typename T>
  9.     class Stack{
  10.         private:
  11.             struct Node{
  12.                 Node():prev(nullptr){};
  13.                 std::shared_ptr<Node> prev;
  14.                 T value;
  15.             };
  16.  
  17.             int size;
  18.             std::shared_ptr<Node> top;
  19.             std::string name;
  20.  
  21.             void deepCopy(const Stack<T>&s){
  22.                  if(this!=&s){
  23.                     size=s.size;
  24.                     auto s_top=s.top;
  25.                     auto this_top=top;
  26.                     //copy values
  27.                     while(s_top){
  28.                         this_top->value=s_top->value;
  29.                         //if  solve with display 0 such a last value problem
  30.                         if(s_top->prev)   this_top->prev=std::make_shared<Node>();
  31.                         this_top=this_top->prev;
  32.                         s_top=s_top->prev;
  33.                     }
  34.                  }
  35.             }
  36.  
  37.         public:
  38.             Stack():size(0),top(std::make_shared<Node>()),name("null"){};
  39.             Stack(const std::string name):size(0),top(std::make_shared<Node>()),name(name){};
  40.             Stack(const Stack<T>&s):size(0),top(std::make_shared<Node>()),name("null"){ deepCopy(s);}
  41.             Stack(const std::string name,const Stack<T>&s):size(0),top(std::make_shared<Node>()),name(name){ deepCopy(s);}
  42.             Stack(Stack<T>&&);
  43.             bool isEmpty()const;
  44.             void push(T);
  45.             const T pop();
  46.             void clear();
  47.             Stack<T>& operator=(const Stack<T>&);
  48.             Stack<T>& operator=(Stack<T>&&);
  49.  
  50.             friend std::ostream&  operator<<(std::ostream& os,const Stack<T>& s){
  51.                 if(s.size==0) return os<<std::endl;
  52.                 if(s.name.compare("null")) os<<"Name: "<<s.name<<"  Size "<<s.size<<std::endl;
  53.                 auto temp=s.top.get();
  54.                 while(temp){
  55.                     os<<temp->value<<std::endl;
  56.                     temp=temp->prev.get();
  57.                 }
  58.                 return os<<std::endl;
  59.             }
  60.     };
  61.  
  62.     template <typename T>
  63.     inline Stack<T>::Stack(Stack<T>&& s):size(0),top(std::make_shared<Node>()),name("null"){
  64.         deepCopy(s);
  65.         if(s.name.compare(name)); name=s.name;
  66.         s.clear();
  67.     }
  68.  
  69.     template <typename T>
  70.     inline bool Stack<T>::isEmpty()const{
  71.         if(size==0) return true;
  72.         return false;
  73.     }
  74.  
  75.     template <typename T>
  76.     void Stack<T>::push(T x){
  77.         std::shared_ptr<Node> add =std::make_shared<Node>();
  78.         add->value=x;
  79.         if(isEmpty()){
  80.             top=std::move(add);
  81.             ++size;
  82.             return;
  83.         }
  84.             add->prev=std::move(top);
  85.             top=std::move(add);
  86.             ++size;
  87.     }
  88.  
  89.     template <typename T>
  90.     const T Stack<T>::pop(){
  91.         T p=top->value;
  92.         if(isEmpty()){
  93.             std::cerr<<std::endl;
  94.             return -1;
  95.         }else{
  96.             top=std::move(top->prev);
  97.             --size;
  98.             return p;
  99.         }
  100.     }
  101.  
  102.     template <typename T>
  103.     inline void Stack<T>::clear(){
  104.         while(top){
  105.             top=std::move(top->prev);
  106.             --size;
  107.         }
  108.     }
  109.  
  110.     template <typename T>
  111.     Stack<T>& Stack<T>::operator=(const Stack<T>&s){
  112.          top =std::make_shared<Node>();
  113.          deepCopy(s);
  114.          return *this;
  115.     }
  116.  
  117.     template <typename T>
  118.     Stack<T>& Stack<T>::operator=(Stack<T>&& s){
  119.          top =std::make_shared<Node>();
  120.          deepCopy(s);
  121.          if(s.name.compare(name)) name=s.name;
  122.          s.clear();
  123.          return *this;
  124.     }
  125. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement