容器库(14)-std::stack

std::stack是一种容器适配器,它通过包装顺序容器来实现栈(先进后出)的数据结构。

template<
    class T,
    class Container = std::deque<T>
> class stack;

本文章的代码库:

https://gitee.com/gamestorm577/CppStd

成员函数

构造、析构和赋值

构造函数

可以构造一个空的stack,也可以用对应的容器或者另一个stack来构造一个stack。代码示例:

std::vector<int> tmp{1, 2, 3};

std::stack<int, std::vector<int>> s1;
std::stack<int, std::vector<int>> s2(tmp);
std::stack<int, std::vector<int>> s3(s2);

std::cout << "s1 size = " << s1.size() << std::endl;
std::cout << "s2 size = " << s2.size() << std::endl;
std::cout << "s3 size = " << s3.size() << std::endl;

输出结果:

s1 size = 0
s2 size = 3
s3 size = 3

析构函数

销毁stack时,会调用各元素的析构函数。代码示例:

struct MyStruct
{
    MyStruct(int i)
        : Num(i)
    {
    }

    ~MyStruct()
    {
        std::cout << "~MyStruct: " << Num << std::endl;
    }

    int Num = 0;
};

std::vector<MyStruct> tmp{1, 2, 3};
std::stack<MyStruct, std::vector<MyStruct>> s(std::move(tmp));
std::cout << "end\n";

输出结果:

~MyStruct: 3
~MyStruct: 2
~MyStruct: 1
end
~MyStruct: 1
~MyStruct: 2
~MyStruct: 3

赋值函数

可以用另一个stack给stack赋值。代码示例:

std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1(tmp);
std::stack<int, std::vector<int>> s2;

s2 = s1;
std::cout << "s2 size = " << s2.size() << std::endl;

输出结果:

s2 size = 3

元素访问

top

返回栈顶元素的引用。代码示例:

std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s(tmp);
std::cout << "s top: " << s.top() << std::endl;
s.top() += 10;
std::cout << "s top: " << s.top() << std::endl;

输出结果:

s top: 3
s top: 13

容量

empty

检查stack是否为空。代码示例:

std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1(tmp);
std::stack<int, std::vector<int>> s2;
std::cout << std::boolalpha;
std::cout << "s1 empty: " << s1.empty() << std::endl;
std::cout << "s2 empty: " << s2.empty() << std::endl;

输出结果:

s1 empty: false
s2 empty: true

size

返回stack中元素的个数。代码示例:

std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1(tmp);
std::stack<int, std::vector<int>> s2;
std::cout << "s1 size: " << s1.size() << std::endl;
std::cout << "s2 size: " << s2.size() << std::endl;

输出结果:

s1 size: 3
s2 size: 0

修改器

push

向栈顶插入元素。代码示例:

std::stack<int, std::vector<int>> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
std::cout << "s top: " << s.top() << std::endl;

输出结果:

s top: 4

emplace

在栈顶构造一个元素。代码示例:

struct MyStruct
{
    MyStruct(int i)
    {
        std::cout << "MyStruct: " << i << std::endl;
    }
};

std::stack<MyStruct> s;
s.emplace(1);
s.emplace(2);
s.emplace(3);

输出结果:

MyStruct: 1
MyStruct: 2
MyStruct: 3

pop

移除栈顶的元素。代码示例:

std::stack<int, std::vector<int>> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);

while (!s.empty())
{
    std::cout << "num: " << s.top() << std::endl;
    s.pop();
}

输出结果:

num: 4
num: 3
num: 2
num: 1

swap

和另一个stack交换元素内容。代码示例:

std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1;
std::stack<int, std::vector<int>> s2(tmp);

s1.swap(s2);
std::cout << "s1 size: " << s1.size() << std::endl;
std::cout << "s2 size: " << s2.size() << std::endl;

输出结果:

s1 size: 3
s2 size: 0

非成员函数

比较运算符

比较两个stack是否相等。代码示例:

std::vector<int> tmp1{1, 2, 3};
std::vector<int> tmp2{3, 2, 1};
std::stack<int, std::vector<int>> s1(tmp1);
std::stack<int, std::vector<int>> s2(tmp2);

std::cout << std::boolalpha;
std::cout << "s1 == s2: " << (s1 == s2) << std::endl;
std::cout << "s1 != s2: " << (s1 != s2) << std::endl;
std::cout << "s1 <  s2: " << (s1 < s2) << std::endl;
std::cout << "s1 <= s2: " << (s1 <= s2) << std::endl;
std::cout << "s1 >  s2: " << (s1 > s2) << std::endl;
std::cout << "s1 >= s2: " << (s1 >= s2) << std::endl;

输出结果:

s1 == s2: false
s1 != s2: true
s1 <  s2: true
s1 <= s2: true
s1 >  s2: false
s1 >= s2: false

swap

交换两个stack的元素内容。代码示例:

std::vector<int> tmp{1, 2, 3};
std::stack<int, std::vector<int>> s1;
std::stack<int, std::vector<int>> s2(tmp);

std::swap(s1, s2);
std::cout << "s1 size: " << s1.size() << std::endl;
std::cout << "s2 size: " << s2.size() << std::endl;

输出结果:

s1 size: 3
s2 size: 0

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值