LOADING

加载过慢请开启缓存 浏览器默认开启

STL的stack的使用

2024/7/13 STL STL

stack(栈)的使用

1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。

  1. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

  2. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:
    empty:判空操作
        back:获取尾部元素操作
        push_back:尾部插入元素操作
        pop_back:尾部删除元素操作

  3. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。

无

stack的构造函数

#include <iostream>
#include <stack>
#include <vector>

int main() {
    // 示例1:使用默认构造函数创建一个空的stack对象,成员为int。
    std::stack<int> myStack;

    // 示例2:使用拷贝构造函数创建一个与现有stack对象相同的新对象。
    std::stack<int> otherStack;
    otherStack.push(1);
    otherStack.push(2);
     //通过复制构造函数,来生成一个复制的新对象
    std::stack<int> newStack(otherStack);

    // 示例3:使用构造函数模板创建一个基于vector的stack对象。
    std::stack<int, std::vector<int>> intStack;
    intStack.push(10);
    intStack.push(20);

:endl;

    return 0;
}

//示例2中新创建的stack对象的元素:2 1 
//示例3中基于vector的stack对象的元素:20 10 

关于最后一个基于vector构造的stack可能有一点疑惑

GPT

在STL中,stack模板类默认使用deque容器作为底层容器来实现栈的功能。但是,stack也支供了另外一个模板参数,允许我们自定义底层容器类型。所以,我们可以通过指定第二个模板参数来使用vector容器作为底层容器来实现stack。

vector容器实现stack的方式是很直观的:stack的push操作就直接调用vector的push_back方法,将元素插入到vector的末尾;stack的pop操作就调用vector的pop_back方法,将vector的最后一个元素弹出;stack的top操作就返回vector的最后一个元素。

由于vector底层采用动态数组来存储元素,因此vector容器实现stack的操作复杂度和vector的操作复杂度一样,即

  • push操作的复杂度为O(1),因为如果vector的空间充足,push操作只需要将元素插入到vector的末尾
  • pop操作的复杂度为O(1),因为vector的pop_back操作的复杂度也为O(1)
  • top操作的复杂度为O(1),因为直接返回vector的最后一个元素,不需要遍历整个容器

因此,基于vector来实现stack具有方便、高效的特点,可以在不需要动态调整容器大小的情况下实现栈的基本功能。

我们在前面也提到了标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque(应该是默认链接队列的方式,vector显然是数组,在性能上有点差异)。

所以stack只是基于这些更加基础的结构建立的栈,有时间可以去了解一下STL的这些


stack成员函数的使用

  • empty()
  • size()
  • top()
  • push()
  • pop()

empty()

(1)empty() 检测stack是否为空

  empty()是stack类的一个成员函数,用于检查当前的stack是否为空。当stack中没有任何元素时,empty()函数返回true;当stack中至少有一个元素时,empty()函数返回false。

if(stack.empty());

size()

(2)size() 返回stack中元素的个数

  size()是stack类的一个成员函数,用于获取当前stack中的元素数量。size()函数返回一个整数,表示stack中的元素数目。

cout<<stack.size();

top()

(3)top() 返回栈顶元素的引用

  top()是stack类的一个成员函数,用于获取stack顶部(即最后压入的)的元素的值,而不会将该元素从stack中移除。

stack<int> stack;
stack.push(1);
int a=stack.top();

push()

(4)push() 将元素val压入stack中

  push()是stack类的一个成员函数,用于将一个元素压入(即添加)到stack的顶部。

stack.push(1);

pop()

(5)pop() 将stack中尾部的元素弹出

  pop()是stack类的一个成员函数,用于移除stack顶部(即最后压入的)的元素,但并不返回该元素的值。

stack.pop();