算法竞赛阶段二-数据结构(40)数据结构栈的STL

//STL栈

#include<bits/stdc++.h>

using namespace std;

int main()

{

stack<int>arr;

for(int i=0;i<10;i++)

{

arr.push(i);

}

// for(int i=0;i<10;i++)

// {

// cout<<arr.top()<<endl;

// arr.pop();

// }

while(!arr.empty())

{

cout<<arr.top()<<endl;

arr.pop();

}

return 0;

}

数据结构栈的C++ STL实现

在计算机科学中,栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构。它支持两个主要操作:入栈(push)和出栈(pop)。入栈将元素添加到栈顶,出栈移除栈顶元素。C++标准模板库(STL)提供了一个高效的stack容器适配器,简化了栈的实现和使用。下面我将一步步解释如何在C++中使用STL的栈。

1. 栈的基本概念
  • 栈的核心操作包括:
    • push(): 将元素添加到栈顶,时间复杂度为O(1)
    • pop(): 移除栈顶元素,时间复杂度为O(1)
    • top(): 访问栈顶元素但不移除,时间复杂度为O(1)
    • empty(): 检查栈是否为空,时间复杂度为O(1)
    • size(): 返回栈中元素的数量,时间复杂度为O(1)
  • STL的stack是基于其他容器(如dequelist)实现的适配器,默认使用deque作为底层容器。
2. 使用STL栈的步骤
  • 包含头文件 :首先需要包含<stack>头文件。

    cpp 复制代码
    #include <stack>
  • 声明栈对象 :使用模板语法声明栈,指定元素类型。例如,创建一个整数栈:

    cpp 复制代码
    std::stack<int> myStack;
  • 常用操作示例

    • push(): 添加元素到栈顶。
    • pop(): 移除栈顶元素(注意:调用前需检查栈是否为空)。
    • top(): 获取栈顶元素值。
    • empty(): 返回布尔值表示栈是否为空。
    • size(): 返回元素个数。
3. 完整代码示例

以下是一个简单的C++程序,演示栈的基本操作:创建栈、入栈、出栈和遍历。

cpp 复制代码
#include <iostream>
#include <stack>  // 包含栈头文件

int main() {
    // 声明一个整数栈
    std::stack<int> stack;

    // 入栈操作:添加元素
    stack.push(10);
    stack.push(20);
    stack.push(30);

    // 输出栈顶元素
    std::cout << "栈顶元素: " << stack.top() << std::endl;  // 输出30

    // 出栈操作:移除栈顶元素
    stack.pop();  // 移除30
    std::cout << "移除后栈顶元素: " << stack.top() << std::endl;  // 输出20

    // 检查栈是否为空
    if (!stack.empty()) {
        std::cout << "栈非空,元素数量: " << stack.size() << std::endl;  // 输出2
    }

    // 遍历栈(栈不支持直接迭代,需借助临时栈)
    std::cout << "栈中元素(从顶到底): ";
    while (!stack.empty()) {
        std::cout << stack.top() << " ";
        stack.pop();  // 边遍历边移除
    }
    std::cout << std::endl;

    return 0;
}
4. 注意事项
  • 底层容器 :默认使用deque,但可以指定其他容器,例如:

    cpp 复制代码
    std::stack<int, std::list<int>> customStack;  // 使用list作为底层容器
  • 时间复杂度:所有核心操作(push, pop, top等)的平均时间复杂度为O(1),因为底层容器(如deque)支持高效访问。

  • 安全性 :调用pop()top()前,务必检查栈是否为空,否则可能导致未定义行为。

  • 应用场景:栈常用于函数调用栈、表达式求值(如括号匹配)、深度优先搜索(DFS)等算法。

通过STL的stack,您可以高效地实现栈操作,避免手动管理内存。如果您有具体问题(如性能优化或特定应用),请提供更多细节!

相关推荐
小溪学编程5 分钟前
Java ListIterator 接口详解:双向遍历与列表修改的利器
java·开发语言·windows
影视飓风TIM6 分钟前
C++11 新特性:Lambda表达式、std::function与std::bind
开发语言·c++
土司大王10 分钟前
LeetCode hot100——全排列
java·算法·leetcode
sbjdhjd10 分钟前
在 8 字符、字母数字过滤与 PHP 版本差异下复盘临时文件命令执行链 | (8字符绕过)
android·java·开发语言·安全·web安全·数据挖掘·php
尾善爱看海14 分钟前
前端面试算法手撕全解(高频真题+标准答案)
算法·js
欧特克_Glodon24 分钟前
OpenCV计算机视觉开发入门与实践<三十六>:机器学习概述
c++·opencv·机器学习·计算机视觉
203号居民33 分钟前
LeetCode hot 100 — 138. 随机链表的复制
算法·leetcode·链表
小七在进步38 分钟前
C++入门(3)
android·java·c++
统计学小王子42 分钟前
数学建模国赛倒计时 1 天 ——《统计模型精讲(逐步回归 R 语言实战篇)》
开发语言·数学建模·r语言
码匠许师傅42 分钟前
【设计模式精讲】27.模板方法模式(Template Method)
c++·设计模式·uml·模板方法模式