C++中stack的用法(超详细,入门必看)

简介: ⭐一、stack的简介stack的中文译为堆栈,堆栈一种数据结构。C语言中堆栈的定义及初始化以及一些相关操作实现起来较为繁琐,而C++的stack让这些都变得简便易实现。因为C++中有许多关于stack的方法函数。堆栈(stack)最大的特点就是先进后出(后进先出)。就是说先放入stack容器的元素一定要先等比它后进入的元素出去后它才能出去。呃这样说可能有点绕哈哈,举个生活中的例子吧。某一天,天气炎热,你买了一个冰淇淋甜筒,而这个冰淇淋甜筒在制作过程时冰淇淋是不是先进入到甜筒的底部然后到最上面呢,但是你在吃的过程中要从最上面吃起到最后才能吃到甜筒底部的冰淇淋,但底部的冰淇淋是先进入甜筒

⭐一、stack的简介

stack的中文译为堆栈堆栈一种数据结构。C语言中堆栈的定义及初始化以及一些相关操作实现起来较为繁琐,而C++的stack让这些都变得简便易实现。因为C++中有许多关于stack的方法函数。

堆栈(stack)最大的特点就是先进后出(后进先出)。就是说先放入stack容器的元素一定要先等比它后进入的元素出去后它才能出去。呃这样说可能有点绕哈哈,举个生活中的例子吧。

某一天,天气炎热,你买了一个冰淇淋甜筒,而这个冰淇淋甜筒在制作过程时冰淇淋是不是先进入到甜筒的底部然后到最上面呢,但是你在吃的过程中要从最上面吃起到最后才能吃到甜筒底部的冰淇淋,但底部的冰淇淋是先进入甜筒的对吧。这就是所谓的先进后出啦!


使用stack时需要包含头文件:

#include<stack>

⭐二、stack的定义及初始化

  • 定义
    stack<数据类型> 容器名
    例:
//stack的定义 
stack<int>s1; //定义一个储存数据类型为int的stack容器s1 
stack<double>s2; //定义一个储存数据类型为double的stack容器s2
stack<string>s3; //定义一个储存数据类型为string的stack容器s3
stack<结构体类型>s4; //定义一个储存数据类型为结构体类型的stack容器s4
stack<int> s5[N]; //定义一个储存数据类型为int的stack容器数组,N为大小 
stack<int> s6[N]; //定义一个储存数据类型为int的stack容器数组,N为大小 

⭐三、stack中常用的成员函数

关于stack的常用函数:

empty() //判断堆栈是否为空
pop() //弹出堆栈顶部的元素
push() //向堆栈顶部添加元素
size() //返回堆栈中元素的个数
top() //返回堆栈顶部的元素 

示例代码:

#include<iostream>
#include<stack>
using namespace std;
int main()
{
  stack<int> s; //定义一个数据类型为int的stack 
  s.push(1); //向堆栈中压入元素1 
  s.push(2); //向堆栈中压入元素2
  s.push(3); //向堆栈中压入元素3
  s.push(4); //向堆栈中压入元素4
  cout<<"将元素1、2、3、4一一压入堆栈中后,堆栈中现在的元素为:1、2、3、4"<<endl;
  cout<<"堆栈中的元素个数为:"<<s.size()<<endl;
  //判断堆栈是否为空 
  if(s.empty())
  {
    cout<<"堆栈为空"<<endl;
  }
  else
  {
    cout<<"堆栈不为空"<<endl;
  }
  cout<<"堆栈的最顶部元素为:"<<s.top()<<endl;
  //弹出堆栈最顶部的那个元素 
  s.pop();
  cout<<"将堆栈最顶部元素弹出后,现在堆栈中的元素为1、2、3"<<endl;
}

运行结果:

将元素1、2、3、4一一压入堆栈中后,堆栈中现在的元素为:1、2、3、4
堆栈中的元素个数为:4
堆栈不为空
堆栈的最顶部元素为:4
将堆栈最顶部元素弹出后,现在堆栈中的元素为1、2、3

⭐四、stack的遍历方法

堆栈中的数据是不允许随机访问的,也就是说不能通过下标访问,且堆栈内的元素是无法遍历的。

我们可以通过while循环的方法将stack中的元素读取一遍,但是这种方法非常局限,因为我们每读取一个元素就需要弹出这个元素,因此该方法只能读取一遍stack中的元素。

例:

#include<iostream>
#include<stack>
using namespace std;
int main()
{
  stack<int> s; //定义一个数据类型为int的stack 
  s.push(1); //向堆栈中压入元素1 
  s.push(2); //向堆栈中压入元素2
  s.push(3); //向堆栈中压入元素3
  s.push(4); //向堆栈中压入元素4
  while(!s.empty())
  {
    cout<<s.top()<<" ";
    s.pop();
  } 
}

⭐五、stack的真题巩固

下面是PTA中团体程序设计天梯赛-练习集的一道L2二阶题目,对于刚学习完本文stack内容的小伙伴来讲做起来可能有点困难哈,但如果你会做了的话那你对于stack的掌握会是比较熟悉的一个状态!

下方为题目链接


833ebbcb5e084d608ec682d2c9a52397.png

堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下:


首先准备两根柱子,一根 A 柱串宝塔,一根 B 柱用于临时叠放。

把第 1 块彩虹圈作为第 1 座宝塔的基座,在 A 柱放好。

将抓到的下一块彩虹圈 C 跟当前 A 柱宝塔最上面的彩虹圈比一下,如果比最上面的小,就直接放上去;否则把 C 跟 B 柱最上面的彩虹圈比一下:

如果 B 柱是空的、或者 C 大,就在 B 柱上放好;

否则把 A 柱上串好的宝塔取下来作为一件成品;然后把 B 柱上所有比 C 大的彩虹圈逐一取下放到 A 柱上,最后把 C 也放到 A 柱上。

重复此步骤,直到所有的彩虹圈都被抓完。最后 A 柱上剩下的宝塔作为一件成品,B 柱上剩下的彩虹圈被逐一取下,堆成另一座宝塔。问:宝宝一共堆出了几个宝塔?最高的宝塔有多少层?

输入格式:

输入第一行给出一个正整数 N(≤10

3

),为彩虹圈的个数。第二行按照宝宝抓取的顺序给出 N 个不超过 100 的正整数,对应每个彩虹圈的直径。


输出格式:

在一行中输出宝宝堆出的宝塔个数,和最高的宝塔的层数。数字间以 1 个空格分隔,行首尾不得有多余空格。


输入样例:

11

10 8 9 5 12 11 4 3 1 9 15

输出样例:

4 5

样例解释:

宝宝堆成的宝塔顺次为:


10、8、5

12、11、4、3、1

9

15、9

AC代码:

#include<bits/stdc++.h>
using namespace std;
int max(int a,int b)
{
  return a>b?a:b;
}
int main()
{
  int n;
  cin>>n;
  stack<int>A,B;
  int count=0;
  int max1=0;
  while(n--)
  {
    int C;
    cin>>C;
    if(A.empty()||C<A.top())
      A.push(C);
    else
    {
      if(B.empty()||C>B.top())
        B.push(C);
      else
      {
        max1=max(max1,A.size());
        while(A.size())
          A.pop();
        count++;
        while(!B.empty()&&B.top()>C)
        {
          A.push(B.top());
          B.pop();
        }
        A.push(C);
      }
    }
  }
  if(!A.empty())
  {
    max1=max(max1,A.size());
    count++;
    while(!A.empty())
    {
      A.pop();
    }
  }
  if(!B.empty())
  {
    max1=max(max1,B.size());
    count++;
    while(!B.empty())
    {
      B.pop();
    }
  }
  cout<<count<<" "<<max1;
}

⭐六、写在最后

OK本文的学习就到此结束啦,希望本文可以帮助到各位有需要的小伙伴们喔,也希望各位小伙伴们不要吝惜手里的三连哦!❤️❤️❤️

💕 回头看,轻舟已过万重山,向前看,前路漫漫亦漫漫。

相关文章
|
9月前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
349 2
|
3月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
46 0
|
7月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
6月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
7月前
|
设计模式 C++ 容器
c++中的Stack与Queue
c++中的Stack与Queue
|
8月前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
180 21
|
10月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
238 3
【C++】map、set基本用法
|
9月前
|
C++
第十三问:C++中静态变量的用法有哪些?
本文介绍了 C++ 中静态变量和函数的用法及原理。静态变量包括函数内的静态局部变量和类中的静态成员变量,前者在函数调用间保持值,后者属于类而非对象。静态函数不能访问非静态成员,但可以通过类名直接调用。静态链接使变量或函数仅在定义文件内可见,避免命名冲突。
221 0
|
11月前
|
存储 算法 调度
【C++打怪之路Lv11】-- stack、queue和优先级队列
【C++打怪之路Lv11】-- stack、queue和优先级队列
144 1