C++中stack的用法及其解析

目录

一、stack的介绍

        1.stack是一个容器适配器,它的名字叫做栈

二、stack的使用

        1.stack的初始化和定义

        2.stack的操作

三、stack的底层实现


一、stack的介绍

        1.stack是一个容器适配器,它的名字叫做

专门用在后进先出的上下文环境中的,它的删除与插入操作只能从容器的一端进行。形象一点,就好像一个容器里放东西,先放进去的就在底部,要想拿出来,就得先把上面(后面放的)先拿出来。和排队是反着干,后面来的,反而先得到解决。

注意:虽然他和内存中的栈帧都是后进先出,但他们是两个完全不同的概念。

栈帧是内存中的一个区域,二stack是一种数据结构。

stack的样子like  this

它需要包含头文件

#include<stack>

二、stack的使用

        1.stack的初始化和定义

先定义一个容器:我们可以选择一些数据存进去即可。

//<>内是想让stack里存入的数据类型
stack<int>s1; //一个储存数据类型为int的stack容器s1 
stack<double>s2; //一个储存数据类型为double的stack容器s2
stack<string>s3; //一个储存数据类型为string的stack容器s3

初始化: 

        2.stack的操作

stack的提供的函数有:

empty()//判断stack是否为空

size();//stack的大小

top();//栈顶元素

push();//入栈

pop();//出栈

下面展示了上面五个操作,同时也是stack的遍历方式:首先判断stack里有没有元素,我们只需每次取出栈顶元素,然后让他出栈,依次打印栈里的内容。

stack的基本操作就是这些,但是要在实际应用中才能感受到stack的强大。

三、stack的底层实现

        1.stack叫做适配器,是因为他的底层是调用了deque的容器,deque就是类似vector这样的容器。这个只需知道了解就行了。

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先我们需要明确什么是 N 皇后问题:在一个 N*N 的棋盘上放置 N 个皇后,使得它们互相之间不能攻击到对方,即任意两个皇后都不能处于同一行、同一列或同一斜线上。 使用栈的方法解决 N 皇后问题,可以采用回溯法。我们可以将每一行的皇后的列编号作为一个栈的元素,从第一行开始,依次向下放置皇后,并且保证每一行的皇后不会与之前的皇后发生冲突。如果当前行无法放置皇后,则回溯到上一行,重新选择皇后的位置。 下面是 C++ 的代码实现: ```c++ #include <iostream> #include <stack> #include <cmath> using namespace std; // 判断皇后是否冲突 bool isConflict(stack<int> s, int row, int col) { int i = 0; while (!s.empty()) { int j = s.top(); if (j == col || abs(row - i) == abs(col - j)) { return true; } s.pop(); i++; } return false; } // 解决 N 皇后问题 void nQueen(int n) { stack<int> s; int row = 0, col = 0; while (row < n) { while (col < n) { if (!isConflict(s, row, col)) { s.push(col); col = 0; break; } col++; } if (s.size() == row) { if (row == n - 1) { // 打印解 cout << "Solution: "; while (!s.empty()) { cout << s.top() << " "; s.pop(); } cout << endl; } else { row++; col = 0; } } else { col = s.top() + 1; s.pop(); row--; } } } int main() { int n = 4; nQueen(n); return 0; } ``` 这里我们定义了两个函数: - `isConflict`:判断当前位置是否与之前的皇后冲突。 - `nQueen`:解决 N 皇后问题的主函数。 在 `nQueen` 函数,我们使用一个栈来保存每一行的皇后的列编号。在每一行,我们依次枚举每一列,判断当前位置是否与之前的皇后冲突。如果当前位置可以放置皇后,则将该位置的列编号压入栈,并且将列编号重置为 0,继续下一行。如果当前行无法放置皇后,则回溯到上一行,重新选择皇后的位置。 当栈的大小等于 N 时,说明找到了一个解,我们输出该解,并且回溯到上一行,继续寻找其他解。如果回溯到第一行仍然无法找到解,则说明不存在解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Though even

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值