汉诺塔移动法则典型模型——栈

汉诺塔游戏流传已久,它主要存在着两种限制:1、先进后出;2、上小下大,而“先进后出”或者“LIFO”(后进先出,Last In First Out)就是汉诺塔移动的法则。

下面是用C++写的栈stack,经过一些简单测试可以实现栈的一些简单操作,测试环境为MS VS8。

  1. #include <tchar.h>
  2. /*
  3. 数据结构——栈
  4. 栈要遵守“后进先出的规则”
  5. */
  6. template <class ElemType>
  7. class stack{
  8. private:
  9.     ElemType* stk_;
  10.     int size_;                      //栈的大小
  11.     int length_;                    //栈中元素的个数
  12. public:
  13.     stack(int initsize);
  14.     ~stack();
  15.     void InitStack(int initsize);    //初始化栈
  16.     void DestroyStack();             //销毁栈
  17.     int GetLength();                 //取得栈中元素个数
  18.     ElemType* GetTop();              //取得顶点元素
  19.     bool StackEmpty();               //栈是否空
  20.     bool StackFull();                //栈是否满
  21.     bool push(ElemType* aItem);      //添加元素,
  22.     ElemType* pop();                 //删除元素
  23.     ElemType* Get(int index);        //取得index位置的元素
  24. };
  25. template<class ElemType>
  26. void stack<ElemType>::InitStack(int initsize)
  27. {
  28.     stk_ = new ElemType[initsize];
  29.     size_ = initsize;
  30.     length_ = 0;
  31. }
  32. template<class ElemType>
  33. void stack<ElemType>::DestroyStack()
  34. {
  35.     delete[] stk_;
  36.     length_ = 0;
  37. }
  38. template<class ElemType>
  39. stack<ElemType>::stack(int initsize)
  40. {
  41.     InitStack(initsize);
  42. }
  43. template<class ElemType>
  44. stack<ElemType>::~stack()
  45. {
  46.     DestroyStack();
  47. }
  48. template<class ElemType>
  49. int stack<ElemType>::GetLength()
  50. {
  51.     return length_;
  52. }
  53. template<class ElemType>
  54. ElemType* stack<ElemType>::GetTop()
  55. {
  56.     return &stk_[length_];
  57. }
  58. template<class ElemType>
  59. ElemType* stack<ElemType>::Get(int index)
  60. {
  61.     if(index < length_)
  62.     {
  63.         return &stk_[index];
  64.     }
  65.     else return NULL;
  66. }
  67. template<class ElemType>
  68. bool stack<ElemType>::StackEmpty()
  69. {
  70.     return(length_ == 0);
  71. }
  72. template<class ElemType>
  73. bool stack<ElemType>::StackFull()
  74. {
  75.     return(length_ == size_);
  76. }
  77. template<class ElemType>
  78. bool stack<ElemType>::push(ElemType* aItem)
  79. {
  80.     if(!StackFull())
  81.     {
  82.         stk_[length_] = *aItem;
  83.         length_ ++;
  84.         return true;
  85.     }
  86.     else return false;
  87. }
  88. template<class ElemType>
  89. ElemType* stack<ElemType>::pop()  
  90. {
  91.     ElemType* p = NULL;
  92.     if(!StackEmpty())
  93.     {
  94.         length_ –;
  95.         p = &stk_[length_];
  96.     }
  97.     return p;
  98. }

测试代码如下:

  1. stack<int>* stk = new stack<int>(10);
  2. for(int i = 0; i < 4; i++)
  3. {
  4.     if (stk->push(&i))
  5.         printf(“%d has been pushed./n”,i);
  6.     else
  7.         printf(“%d pushed failed!/n”,i);
  8. }
  9. printf(“%d has get top./n”,stk->GetTop());
  10. for(int i = 0; i < 4; i++)
  11. {
  12.     printf(“%d has been getted./n”,*stk->Get(i));
  13. }
  14. for(int i = 0; i < 3; i++)
  15. {
  16.     printf(“%d has been pop./n”,*stk->pop());
  17. }
  18. for(int i = 0; i < 4; i++)
  19. {
  20.     int* a = stk->Get(i);
  21.     if (a != NULL)
  22.         printf(“%d has been getted./n”,*a);
  23.     else
  24.         printf(“No%d. Item is not exist!/n”,i);
  25. }
  26. delete stk;
    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/NextLeap/article/details/2993038
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞