「C/C++」C++ STL容器库 之 std::stack 栈容器

时间:2024-10-24 12:38:13

在这里插入图片描述

✨博客主页
何曾参静谧的博客
????文章专栏
「C/C++」C/C++程序设计
????全部专栏
「VS」Visual Studio 「C/C++」C/C++程序设计 「UG/NX」BlockUI集合
「Win」Windows程序设计 「DSA」数据结构与算法 「UG/NX」NX二次开发
「QT」QT5程序设计 「File」数据文件格式 「PK」Parasolid函数说明

目录

      • std::stack容器详解
        • 1. 引用头文件
        • 2. 函数构造与对象初始化
        • 3. 元素访问
        • 4. 迭代器
        • 5. 容器
        • 6. 修改器
        • 7. 元素比较
        • 总结与应用

std::stack容器详解

在这里插入图片描述
上图截取自黑马C++教程

1. 引用头文件

在C++中,要使用std::stack容器,首先需要包含<stack>头文件。这个头文件提供了std::stack类的定义,该类是一个容器适配器,提供了基于堆栈(LIFO, Last-In-First-Out)的数据结构。

#include <stack>
2. 函数构造与对象初始化

std::stack类模板的构造函数有几种形式,包括默认构造函数、通过底层容器对象进行构造、使用std::allocator对象作为参数进行构造等。最常用的构造函数是默认构造函数和通过底层容器对象进行构造。

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

int main() {
    // 默认构造函数,创建一个空的堆栈
    std::stack<int> intStack;

    // 使用std::deque作为底层容器的堆栈
    std::deque<int> dequeElements = {1, 2, 3, 4, 5};
    std::stack<int, std::deque<int>> dequeStack(dequeElements);

    // 使用std::vector作为底层容器的堆栈
    std::vector<int> vectorElements = {10, 20, 30};
    std::stack<int, std::vector<int>> vectorStack(vectorElements);

    // 输出堆栈大小
    std::cout << "Size of intStack: " << intStack.size() << std::endl;
    std::cout << "Size of dequeStack: " << dequeStack.size() << std::endl;
    std::cout << "Size of vectorStack: " << vectorStack.size() << std::endl;

    return 0;
}
3. 元素访问

在这里插入图片描述

std::stack类提供了top()成员函数来访问栈顶元素。需要注意的是,top()函数只是返回栈顶元素的引用,并不从栈中移除该元素。如果栈为空,调用top()函数会导致未定义行为。

#include <iostream>
#include <stack>

int main() {
    std::stack<int> myStack;
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);

    // 访问栈顶元素
    int topElement = myStack.top();
    std::cout << "Top element: " << topElement << std::endl;

    // 不移除栈顶元素
    std::cout << "Top element after access: " << myStack.top() << std::endl;

    return 0;
}
4. 迭代器

std::stack不支持迭代器,因为它是序列适配器,不提供遍历功能。只能通过push()pop()top()等特定接口访问数据。

#include <stack>
#include <iostream>
using namespace std;

//栈容器常用接口
int main()
{
	//创建栈容器 栈容器必须符合先进后出
	stack<int> s;

	//向栈中添加元素,叫做 压栈 入栈
	s.push(10);
	s.push(20);
	s.push(30);
	while (!s.empty()) {
		//输出栈顶元素
		cout << "栈顶元素为: " << s.top() << endl;
		//弹出栈顶元素
		s.pop();
	}
	cout << "栈的大小为:" << s.size() << endl;
}
5. 容器

在这里插入图片描述

std::stack本身不拥有数据存储,而是利用其他容器(如std::deque、std::vector)作为其底层,来存储和管理元素。默认情况下,std::stack使用std::deque作为其底层容器。

#include <iostream>
#include <stack>

int main() {
    std::stack<int> myStack;
    myStack.push(10);
    myStack.push(20);
    myStack.push(30);
    myStack.empty(); // false
    std::cout << myStack.size() << std::endl;// 3
	
}
6. 修改器

在这里插入图片描述

std::stack提供了push()pop()成员函数来修改栈中的元素。push()函数在栈顶插入元素,pop()函数移除栈顶元素。

#include <iostream>
#include <stack>

int main() {
    std::stack<int> myStack;

    // 向栈中添加元素
    myStack.push(1);
    myStack.push(2);
    myStack.push(3);

    // 移除栈顶元素
    myStack.pop();

    // 访问并打印栈顶元素
    std::cout << "Top element after pop: " << myStack.top() << std::endl;

    return 0;
}
7. 元素比较

std::stack本身不提供元素比较功能,但可以通过比较栈顶元素来间接实现元素比较。需要注意的是,在比较之前应确保栈不为空。

#include <iostream>
#include <stack>

int main() {
    std::stack<int> stack1;
    std::stack<int> stack2;

    stack1.push(10);
    stack2.push(20);

    if (!stack1.empty() && !stack2.empty()) {
        if (stack1.top() < stack2.top()) {
            std::cout << "stack1 top is less than stack2 top" << std::endl;
        } else {
            std::cout << "stack1 top is greater than or equal to stack2 top" << std::endl;
        }
    }

    return 0;
}
总结与应用

std::stack是一个简单且易于使用的容器适配器,提供了基于堆栈的数据结构,适用于许多不同的编程场景。它的主要优点是后进先出(LIFO)的特性,使得它在实现递归和回溯算法、表达式求值(如逆波兰表示法)、深度优先搜索(DFS)算法、括号匹配等需要LIFO数据结构的场景中非常有用。

在使用std::stack时,需要根据具体需求选择合适的底层容器,并小心处理异常和性能问题。默认情况下,std::stack使用std::deque作为其底层容器,但也可以根据需要选择std::vector或其他容器。此外,还需要注意在调用top()或pop()函数之前检查栈是否为空,以避免未定义行为。


在这里插入图片描述