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

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

相关文章
|
11天前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
51 0
|
1月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
33 3
【C++】map、set基本用法
|
11天前
|
C++
第十三问:C++中静态变量的用法有哪些?
本文介绍了 C++ 中静态变量和函数的用法及原理。静态变量包括函数内的静态局部变量和类中的静态成员变量,前者在函数调用间保持值,后者属于类而非对象。静态函数不能访问非静态成员,但可以通过类名直接调用。静态链接使变量或函数仅在定义文件内可见,避免命名冲突。
25 0
|
2月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
47 2
C++入门12——详解多态1
|
2月前
|
存储 算法 调度
【C++打怪之路Lv11】-- stack、queue和优先级队列
【C++打怪之路Lv11】-- stack、queue和优先级队列
43 1
|
2月前
|
设计模式 存储 C++
C++之stack 和 queue(下)
C++之stack 和 queue(下)
44 1
|
2月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
89 1
|
2月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
32 0
|
2月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
39 0
|
2月前
|
C++ 容器
C++之stack 和 queue(上)
C++之stack 和 queue(上)
65 0