zoukankan      html  css  js  c++  java
  • 栈的实现

    该程序定义了链式栈(栈的链式存储结构)的存储结构,并实现了链式栈的基本操作,例如:构造函数、拷贝构造函数和赋值运算符重载函数的实现、析构函数、判空、插入、删除、获取栈顶元素,遍历。

     
      1 #include<iostream>
      2 
      3 using namespace std;
      4 
      5 typedef int StackElement;
      6 
      7 struct Node
      8 
      9 {
     10 
     11      Node *next;
     12 
     13      StackElement data;
     14 
     15      Node(StackElement value, Node *link = NULL) :data(value),next(link)
     16 
     17     {}
     18 
     19 };
     20 
     21 class Stack
     22 
     23 {
     24 
     25 public:
     26 
     27         Stack() :myTop(NULL)
     28 
     29                      {}
     30 
     31          Stack(const Stack& original)
     32 
     33          {
     34 
     35              myTop = NULL;
     36 
     37              if (!original.empty())
     38 
     39             {
     40 
     41                       myTop = new Node(original.Top());  //复制第一个节点
     42 
     43                      Nodeptr lastPtr = myTop;    //设置指针以遍历整个栈的链表
     44 
     45                      Nodeptr origPtr =original.myTop->next;
     46 
     47              while (origPtr != 0)
     48 
     49              {
     50 
     51                      lastPtr->next = new Node(origPtr->data);
     52 
     53                      lastPtr = lastPtr->next;
     54 
     55                      origPtr = origPtr->next;
     56 
     57               }
     58 
     59          }
     60 
     61     }
     62 
     63     ~Stack()
     64 
     65     {
     66 
     67                    Nodeptr ptr = myTop, nextPtr;//ptr将被释放的节点,nextptr是ptr后继
     68 
     69                   while (ptr!=0)
     70 
     71                    {
     72 
     73                             nextPtr = ptr->next;
     74 
     75                             delete ptr;
     76 
     77                             ptr = nextPtr;
     78 
     79                    }
     80 
     81     }
     82 
     83     Stack& operator=(const Stack&rhs)
     84 
     85     {
     86 
     87             if (this!=&rhs)
     88 
     89             {
     90 
     91                    this->~Stack();//销毁当前的链表
     92 
     93                  if (rhs.empty())  //空栈
     94 
     95                       myTop = NULL;
     96 
     97                   else
     98 
     99                   {
    100 
    101                             myTop = new Node(rhs.Top());   //复制第一个节点
    102 
    103                           Nodeptr lastPtr = myTop;    //设置指针以遍历整个栈的链表
    104 
    105                            Nodeptr rhsPtr = rhs.myTop->next;
    106 
    107                       while (rhsPtr != 0)
    108 
    109                        {
    110 
    111                            lastPtr->next = new Node(rhsPtr->data);
    112 
    113                             lastPtr = lastPtr->next;
    114 
    115                             rhsPtr = rhsPtr->next;
    116 
    117                        }
    118 
    119                  }
    120 
    121             }
    122 
    123     return *this;
    124 
    125     }
    126 
    127     StackElement Top() const
    128 
    129     {
    130 
    131            if (!empty())
    132 
    133           {
    134 
    135                  return (myTop->data);
    136 
    137           }
    138 
    139          else
    140 
    141           {
    142 
    143                 cout << "The Stack is empty!" << endl;
    144 
    145           }
    146 
    147     }
    148 
    149     bool empty() const
    150 
    151     {
    152 
    153            return myTop==0;
    154 
    155     }
    156 
    157     void push(const StackElement& value)
    158 
    159     {
    160 
    161           myTop = new Node(value, myTop);
    162 
    163     }
    164 
    165     void Display()
    166 
    167     {
    168 
    169          Nodeptr ptr;
    170 
    171          for (ptr = myTop; ptr != 0; ptr = ptr->next)
    172 
    173          cout << ptr->data <<" ";
    174 
    175          cout << endl;
    176 
    177     }
    178 
    179     void pop()
    180 
    181     {
    182 
    183          if (!empty())
    184 
    185          {
    186 
    187                Nodeptr ptr=myTop;
    188 
    189                myTop = myTop->next;
    190 
    191                delete ptr;
    192 
    193          }
    194 
    195         else
    196 
    197         {
    198 
    199                cout << "Stack is empty" << endl;
    200 
    201         }
    202 
    203     }
    204 
    205 private:
    206 
    207    typedef Node* Nodeptr;
    208 
    209    Nodeptr myTop;
    210 
    211 };
    212 
    213 void main()
    214 
    215 {
    216 
    217    Stack s;
    218 
    219    cout<<s.empty()<<endl;
    220 
    221    for (StackElement i = 1; i < 6; ++i)
    222 
    223    {
    224 
    225            s.push(i);
    226 
    227    }
    228 
    229    cout << s.empty() << endl;
    230 
    231    cout << s.Top() << endl;
    232 
    233    s.Display();
    234 
    235    s.pop();
    236 
    237    s.Display();
    238 
    239    Stack s1(s);
    240 
    241    s1.Display();
    242 
    243    Stack s2;
    244 
    245     s2 = s;
    246 
    247     s2.Display();
    248 
    249     system("pause");
    250 
    251 }
     
     
  • 相关阅读:
    Xcode 构建规则
    创建带阴影,有圆角的UIView的正确方式
    EffectiveC#12,13,14--成员初始化
    EffectiveC#11--选择foreach循环
    EffectiveC#9--明白几个相等运算之间的关系
    EffectiveC#8--确保0对于值类型数据是有效的(初始化问题)
    NET基础课--泛型(NET之美)
    NET基础课-- 类型基础(NET之美)
    EffectiveC#7--选择恒定的原子值类型数据
    EffectiveC#6--区别值类型数据和引用类型数据
  • 原文地址:https://www.cnblogs.com/yuanshuang/p/5354299.html
Copyright © 2011-2022 走看看