栈的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 }

 

posted on 2017-02-03 18:57  京城妖  阅读(279)  评论(0编辑  收藏  举报

导航