棧:只允許在棧頂進行刪除和插入操作的順序表。(FILO,先進後出)
如下圖:
在棧裏面有以下幾項基本操作:
pop()//刪除棧頂數據
push(data)//在棧頂插入一個數據data
top()//返回棧頂元素
size()//返回棧中元素的個數
empty()//判斷棧是否爲空
下面進行代碼實現:
#include<iostream>
using namespace std;
template <typename T>
class Stack
{
protected:
T* _a;//存儲數據
int _size;//數據個數
int _capacity;//容量
public:
Stack()//構造函數
:_a(NULL)
,_size(0)
,_capacity(0)
{}
Stack(const Stack<T>& S)//拷貝構造函數
:_size(S._size)
,_capacity(S._capacity)
{
T* tmp = new T[S._capacity];
for(size_t i = 0; i < S._size; i++)
{
tmp[i] = S._a[i];
}
_a = tmp;
}
~Stack()//析構函數
{
delete[] _a;
_a = NULL;
}
void Push(const T& data)//插入
{
_ChackCapacity();//判斷容量是否夠用
_a[_size] = data;
_size++;
}
void Pop()//刪除
{
if(_size)
{
_size--;
}
}
T& Top()//返回棧頂元素
{
if(_size)
{
return _a[_size-1];
}
}
int _Size()//返回元素個數
{
return _size;
}
bool Empty()//判斷棧是否爲空
{
return !(_Size());
}
int _Capacity()//返回棧容量
{
return _capacity;
}
protected:
void _ChackCapacity()//增容
{
if(_size >= _capacity)
{
//NewCpacity爲新的容量
int NewCpacity = _capacity*2+3;//因爲_capacity的初始值爲0,所以這裏加3
T* tmp = new T[NewCpacity];//new 一塊大小爲NewCpacity的空間
for(size_t i = 0; i < _size; i++)//將原先那塊空間裏的元素拷貝到新的空間裏
{
tmp[i] = _a[i];
}
delete[] _a;//釋放舊的空間
_a = tmp;//讓_a指向新的空間;
_capacity = NewCpacity;//改變容量大小
}
}
};
int main()
{
Stack<int> s;//構建一個整型的對象
//插入1,2,3,4,5,6,六個對象
s.Push(1);
s.Push(2);
s.Push(3);
s.Push(4);
s.Push(5);
s.Push(6);
//刪除棧頂元素
s.Pop();
s.Pop();
s.Pop();
cout<<"容量:"<<s._Capacity()<<endl<<endl;//返回棧的容量
cout<<"元素數量:"<<s._Size()<<endl<<endl;//返回棧中元素的數量
s.Empty();//判斷棧是否爲空
cout<<"棧中元素:";
while(s._Size())//輸出棧中元素
{
cout<<s.Top()<<" ";
s.Pop();
}
cout<<endl<<endl;
return 0;
}
結果:
因爲在棧中只能訪問棧頂元素,所以先打印棧頂元素,然後再將其刪除,讓倒數第二個數成爲棧頂元素,在進行打印,以此類推。
缺點是在打印完元素棧也被清空了。