堆栈是一个线性表,插入和删除只在表的一段进行,该端称为栈顶,另一端称为栈底。堆栈的元素插入称为入栈,元素的删除称为出栈。由于元素的出与入均在栈顶进行,则堆栈是一个后进先出表,即LIFO(last in first out)。
C++ STL的堆栈泛化是直接通过现有的序列容器来实现的,默认的是使用双端队列deque的数据结构,当然也可以用其他线性表vector和list。
实际上在我们使用的时候,我们只使用堆栈的入栈、出栈、栈顶元素的访问、判断是否为空、获取堆栈的大小等功能。stack具体应用
创建stack对象
在使用堆栈前,先利用构造函数进行初始化,创建一个堆栈对象,以便之后进行元素的入栈和出栈等相关操作。
1)stack()
默认的构造函数,创建一个空的stack对象
stack<int> s;
2)stack(const stack&)
复制构造函数,用一个stack堆栈创建一个新的堆栈。
stack<list,list<int>> s2(s1);
元素入栈
stack堆栈容器的元素入栈函数为push函数,由于c++ stl的堆栈不是预设大小的,因此,入栈函数就不考虑堆栈空间是否为满,均将元素压入堆栈,从而函数没有标明入栈成功与否的返回值。
void push(const value_type& x)
元素入栈,将元素x压入堆栈,成为栈顶元素。
下面的实例代码为将元素依次压入堆栈
stack<int> s;
s.push(3);
s.push(19);
s.push(23);
s.push(36);
s.push(50);
元素出栈
stack容器的元素出栈函数为pop函数。由于函数并没有判断堆栈是否为非空,才进行元素的弹出;因此,需要自行判断堆栈是否为空,才可执行pop函数。
void pop()
元素出栈,将栈顶元素从堆栈中删除。该函数并不返回出栈的栈顶元素,一般需要先将栈顶元素取出,才执行出栈操作。
下面的实例代码为将堆栈中的所有元素全部出栈
while(!s.empty())
{
s.pop();//出栈
}
取栈顶元素
stack容器的栈顶元素的读取函数为top函数
取出栈顶元素,此函数也要先判断堆栈是否为空,取出栈顶元素才有意义
下面实例代码为在元素出栈前,先将栈顶元素取出
cout<< s.top()<<endl;//打印栈顶元素
s.pop();//出栈
堆栈非空判断
随着栈顶元素的不断出栈,堆栈可能会出现空的情况;因此一般需要调用empty函数判断是否为非空,才作元素的出栈和取栈顶元素的操作。
bool empty()
判断堆栈是否为空,返回true表示堆栈已空,false表示堆栈非空。
堆栈的大小
堆栈的元素个数可用size函数获得。每次元素入栈前,先检查当前堆栈的大小,超过某个界限值,则不允许元素入栈,此可实现一个具有一定容量限制的堆栈。
size_type size()返回当前堆栈的元素个数
下面的实例代码为判断是否栈满,若无,则可继续压栈
if(s.size()<STACK_SIZE)//堆栈未满,元素才可入栈
{
s.push(1);
}