与队列类似,栈也是一种线性表,不过区别与队列的是,栈的存取方式是先进后出,就像车库一样,汽车正着开进去,要倒着开出来。
栈的地址空间固定,分配好空间后,栈底不动,存储一个数据,栈顶+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 }