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

    与队列类似,栈也是一种线性表,不过区别与队列的是,栈的存取方式是先进后出,就像车库一样,汽车正着开进去,要倒着开出来。

    栈的地址空间固定,分配好空间后,栈底不动,存储一个数据,栈顶+1,取出一个栈顶数据,栈顶-1。

    栈也有与队列类似的基本功能,因为栈底不动,所以没有定义栈底的成员变量,默认为0,栈长度即为栈顶的值,所以长度同样没有定义。

     1 #ifndef MyStack_h
     2 #define MyStack_h
     3 
     4 class MyStack
     5 {
     6 public:
     7     MyStack(int stackCapacity);     //构造栈
     8     ~MyStack();                     //销毁栈
     9     void ClearStack();              //清空栈
    10     bool StackFull() const;         //栈判满
    11     bool StackEmpty() const;        //栈判空
    12     int StackLength();              //栈长度
    13     bool Push(int element);         //栈顶入栈
    14     bool Pop(int &element);         //栈顶出栈
    15     void StackTraverse();           //遍历栈
    16 private:
    17     int *_pStack;
    18     int _iStackCapacity;
    19     int _iTop;
    20 };
    21 
    22 #endif /* MyStack_h */

    函数实现中,构造、销毁与清空栈与队列类似

     1 MyStack::MyStack(int stackCapacity)
     2 {
     3     _iStackCapacity=stackCapacity;
     4     _pStack=new int[_iStackCapacity];
     5     ClearStack();
     6 }
     7 
     8 MyStack::~MyStack()
     9 {
    10     delete[] _pStack;
    11     _pStack=NULL;
    12 }
    13 
    14 void MyStack::ClearStack()
    15 {
    16     _iTop=0;
    17 }

    在判空和判满中,直接使用栈顶和0与栈容量相比较

     1 bool MyStack::StackFull() const
     2 {
     3     if(_iTop==_iStackCapacity)
     4     {
     5         return true;
     6     }
     7     else
     8     {
     9         return false;
    10     }
    11 }
    12 
    13 bool MyStack::StackEmpty() const
    14 {
    15     if(_iTop==0)
    16     {
    17         return true;
    18     }
    19     else
    20     {
    21         return false;
    22     }
    23 }

    栈顶数值即为栈长度。

    须注意的是,进栈的过程是先把元素赋值给栈顶,然后栈顶移动。

    所以,出栈的过程须完全相反,先栈顶移动,然后读取栈顶信息。不然,会导致出栈时读取的信息错误。

     1 int MyStack::StackLength()
     2 {
     3     return _iTop;
     4 }
     5 
     6 bool MyStack::Push(int element)
     7 {
     8     if(StackFull())
     9     {
    10         return false;
    11     }
    12     else
    13     {
    14         _pStack[_iTop]=element;
    15         _iTop++;
    16         return true;
    17     }
    18 }
    19 
    20 bool MyStack::Pop(int &element)
    21 {
    22     if(StackEmpty())
    23     {
    24         return false;
    25     }
    26     else
    27     {
    28         _iTop--;
    29         element=_pStack[_iTop];
    30         return true;
    31     }
    32 }

    最后是遍历栈,用简单的for循环即可完成

     1 void MyStack::StackTraverse()
     2 {
     3     using namespace std;
     4     
     5     cout<<endl;
     6     for(int i=0;i<_iTop;i++)
     7     {
     8         cout<<_pStack[i]<<endl;
     9     }
    10     cout<<endl;
    11 }
  • 相关阅读:
    ora-01034 ora-27101解决方法(亲测)
    windows C++内存检测
    oracle求特定字符的个数
    ORACLE查看并修改最大连接数
    你必须用角色管理工具安装Microsoft .NET Framework 3.5
    让VC编译的Release版本程序在其他机器上顺利运行
    创建数据库连接
    C++ 判断进程是否存在
    excel
    毕设学习笔记
  • 原文地址:https://www.cnblogs.com/Bird-of-Paradise/p/6363285.html
Copyright © 2011-2022 走看看