c++用双向链表实现模板栈

 
可直接编译运行,其中方法status为形象的显示出栈的结构:

  1 // visual stack , need define "cout<<" 
  2 
  3 #include <iostream>
  4 using std::cout;
  5 
  6 template<typename T>
  7 struct item
  8 {
  9     item():value(),last(NULL),next(NULL){}
 10     item *last,*next;
 11     T value;
 12 };
 13 template<typename T>
 14 class Stack
 15 {
 16     public:
 17         Stack():m_size(0),m_bottom(NULL),m_top(NULL){}
 18         int size();
 19         bool push(const T&);
 20         T pop();
 21         T top();
 22         bool empty();
 23         void status();
 24     private:
 25         item<T> *m_bottom,*m_top;
 26         int m_size;
 27 };
 28 
 29 
 30 ///////////////////
 31 int main()
 32 {
 33     Stack<int> st;
 34     for(int i=0;i<10;i++)
 35     {
 36         st.push(i);
 37         st.status();
 38     }
 39     cout<<"size="<<st.size()<<"
";
 40     
 41     for(    i=0;i<10;i++)
 42     {
 43         st.pop();
 44         st.status();
 45     }
 46     if(st.empty())cout<<"empty
";
 47     cout<<st.top()<<"
";
 48     return 0;
 49 }
 50 
 51 
 52 ////////////////////////////
 53 template<typename T>
 54 inline int Stack<T>::size(){return m_size;}
 55 
 56 template<typename T>
 57 inline bool Stack<T>::empty(){return m_size==0?false:true;}
 58 
 59 template<typename T>
 60 inline T Stack<T>::top(){return m_size!=0?m_top->value:T();}
 61 
 62 template<typename T>
 63 bool Stack<T>::push(const T& t)
 64 {
 65     if(m_size==0)
 66     {
 67         m_bottom=new item<T>;
 68         m_bottom->value=t;
 69         m_top=m_bottom;
 70     }
 71     else
 72     {
 73         m_top->next=new item<T>;
 74         m_top->next->value=t;
 75         m_top->next->last=m_top;
 76         m_top=m_top->next;
 77     }
 78     m_size++;
 79     return true;
 80 }
 81 
 82 template<typename T>
 83 T Stack<T>::pop()
 84 {
 85     if(m_size==1)
 86     {
 87         T t=m_top->value;
 88         delete m_top;
 89         m_bottom=m_top=NULL;
 90         m_size=0;
 91         return t;
 92     }
 93     else if(m_size==0)
 94     {
 95         return T();
 96     }
 97     else 
 98     {
 99         T t=m_top->value;
100         m_top=m_top->last;
101         delete m_top->next;
102         m_top->next=NULL;
103         m_size--;
104         return t;
105     }
106     return T();
107 }
108 
109 template<typename T>
110 void Stack<T>::status()
111 {
112     item<T> *p;
113     cout<<"栈顶  |
";
114     if( m_size==0 )return ;
115     else if(m_size<10)
116     {
117         for(p=m_top;p!=NULL;p=p->last)
118         {    
119             if(p->last==NULL)cout<<"栈底  |"<<p->value<<"|
";
120             else cout<<"      |"<<p->value<<"|
";
121         }
122     }
123     else 
124     {
125         int i;
126         for(p=m_top,i=0;i<4;p=p->last,i++)cout<<"      |"<<p->value<<"|
";
127         for(p=m_bottom,i=0;i<4;p=p->next,i++);
128         cout<<"      略...
";
129         for(;i>=0;i--,p=p->last)
130         {
131             if(i==0)cout<<"栈底  |"<<p->value<<"|
";
132             else cout<<"      |"<<p->value<<"|
";
133         }
134     }
135 }
原文地址:https://www.cnblogs.com/backinfile/p/5820354.html