数据结构---栈实现(源码)

第三章   栈

  1. /*****************************SqList********************************** 
  2. Date:2008.10.30 
  3. Author:ZORO 
  4. WebSite:http://blog.csdn.net/sevenhu 
  5. ====================================================================== 
  6. 参考资料: 
  7. BOOK:数据结构(C语言版)     严蔚敏     清华大学出版社 
  8. Page:47 
  9. ====================================================================== 
  10. ADT SqStack  { 
  11.     InitStack(&S)
  12.     DestroyStack(&S) 
  13.     ClearStack(&S) 
  14.     StackEmpty(S) 
  15.     StackLength(S) 
  16.     GetTop(S,&e)
  17.     Push(&S,e)
  18.     Pop(&S,&e)
  19.     StackTraverse(S) 
  20. }ADT SqStack 
  21. ====================================================================== 
  22. note:VC++ 6.0测试通过。 
  23. *********************************************************************/ 
  24. #include <iostream>
  25. using namespace std;
  26. #define     STACK_INIT_SIZE     100                                 //存储空间初始化量
  27. #define     STACKINCREMENT      10                                  //存储空间增量
  28. #define     OK                  1
  29. #define     ERROR               0
  30. #define     OVERFLOW            -1
  31. #define     NULL                0
  32. typedef int  Status;                                                //返回值标志
  33. typedef bool BOOL;
  34. typedef struct
  35. {
  36.     int * base;
  37.     int * top;
  38.     int stacksize;
  39. }SqStack;
  40. Status InitStack(SqStack &S)
  41. {
  42.     //构造一个空栈
  43.     int * bp = (int *)malloc(STACK_INIT_SIZE * sizeof(int));        //分配空间
  44.     
  45.     if (bp == NULL)
  46.     {
  47.         exit(OVERFLOW);
  48.     }
  49.     else
  50.     {
  51.         S.top = S.base = bp;                                        //初始化
  52.     }
  53.     S.stacksize = STACK_INIT_SIZE;                                  //栈容量
  54.     bp = NULL;
  55.     return OK;
  56. }//InitStack
  57. Status DestroyStack(SqStack &S)
  58. {
  59.     //销毁栈
  60.     int * bp = S.base ;
  61.     free(bp);                                                       //释放空间
  62.     bp = S.base = S.top = NULL;                                     //销毁栈信息
  63.     S.stacksize = 0;
  64.     return OK;
  65. }//DestroyStack
  66. Status ClearStack(SqStack &S)
  67. {
  68.     //清空栈
  69.     S.top = S.base;
  70.     return OK;
  71. }//ClearStack
  72. BOOL StackEmpty(SqStack S)
  73. {
  74.     //判断栈空
  75.     if (S.base == S.top )
  76.     {
  77.         return true;
  78.     }
  79.     else
  80.     {
  81.         return false;
  82.     }
  83. }//StackEmpty
  84. int StackLength(SqStack S)
  85. {
  86.     //反回栈的长度
  87.     int i = 0;
  88.     int * pbase = S.base ;
  89.     int * ptop = S.top ;
  90.     while (pbase != ptop) {
  91.         ++i;
  92.         ++pbase;
  93.     }
  94.     pbase = ptop = NULL;
  95.     return i;
  96. }//StackLength
  97. Status GetTop(SqStack S, int &e)
  98. {
  99.     //e返回栈顶元素
  100.     if (StackEmpty(S))
  101.     {
  102.         return ERROR;
  103.     }
  104.     else
  105.     {
  106.         e = *(S.top - 1);
  107.         return OK;
  108.     }
  109. }//GetTop
  110. Status Push(SqStack &S, int e)
  111. {
  112.     //插入元素e到栈顶
  113.     int * pb = NULL;
  114.     if (S.top - S.base >= S.stacksize )
  115.     {
  116.         pb = (int *)realloc(S.base, 
  117.                 (S.stacksize + STACKINCREMENT) * sizeof(int));      //追加空间
  118.         if (pb == NULL)
  119.         {
  120.             exit(OVERFLOW);
  121.         }
  122.         else
  123.         {
  124.             S.base = pb;                                            //新栈底指针位置
  125.             S.top = S.base + S.stacksize ;                          //确定top位置
  126.             S.stacksize += STACKINCREMENT;
  127.         }
  128.     }
  129.     *S.top++ = e;                                               //插入元素,栈顶指针上移
  130.     pb = NULL;
  131.     return OK;
  132. }//Push
  133. Status Pop(SqStack &S, int &e)
  134. {
  135.     //弹出栈顶元素给e
  136.     if (StackEmpty(S))
  137.     {
  138.         return ERROR;
  139.     }
  140.     else
  141.     {
  142.         e = *--S.top ;                                              //栈顶指针下移,返回元素
  143.         return OK;
  144.     }
  145. }//Pop
  146. Status StackTraverse(SqStack S)
  147. {
  148.     //遍历栈
  149.     int * pb = NULL;
  150.     if (StackEmpty(S))
  151.     {
  152.         return ERROR;
  153.     }
  154.     else
  155.     {
  156.         pb = S.base;
  157.     
  158.         while (pb != S.top)
  159.         {
  160.             cout << *pb++ << " ";                                   //输出当前元素,并把指针上移
  161.         }
  162.         cout << endl;
  163.         return OK;
  164.     }
  165. }//StackTraverse
  166. int main()
  167. {
  168.     SqStack S;
  169.     InitStack(S);
  170.     
  171.     for (int i=0; i<10; ++i)
  172.     {
  173.         Push(S,i);
  174.     }
  175.     
  176.     cout << "压栈成功!" << endl;
  177.     StackTraverse(S);
  178.     cout << "弹出2个元素" << endl;
  179.     int e = 0;
  180.     for (i=0; i<2; ++i)
  181.     {
  182.         Pop(S,e);
  183.         cout << e << endl;
  184.     }
  185.     cout << "弹出成功!" << endl;
  186.     StackTraverse(S);
  187.     cout << "栈的长度:" << StackLength(S) << endl;
  188.     GetTop(S,e);
  189.     cout << "栈顶元素是" << e << endl;
  190.     cout << "清空栈..." << endl;
  191.     ClearStack(S);
  192.     cout << "重新压栈!" << endl;
  193.     for (i=10; i>0; --i)
  194.     {
  195.         Push(S,i);
  196.     }
  197.     StackTraverse(S);
  198.     cout << "销毁栈..." << endl;
  199.     DestroyStack(S);
  200.     return 0;
  201. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值