C++ stack(栈)

目录

概念

实现原理

栈的定义

C++中的stack

基本操作与方法接口

定义、初始化和赋值

插入

访问

删除

判空

获取元素个数

交换

构造新元素

遍历

参考与引用


概念

在 C++ 中,stack 是一种容器适配器,它通过封装底层容器的实现,为开发人员提供了“栈”这一数据结构的高层次操作接口。

实现原理

栈的定义

栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。

这意味着最后添加到栈中的元素将是第一个被移出的元素,类似于现实生活中的一摞盘子,最后放上去的盘子会最先被拿走。所以栈遵循后进先出(Last In First Out,LIFO)原则,简称LIFO结构。

栈顶(Top):线性表允许进行插入删除的那一端。

栈底(Bottom):固定的,不允许进行插入和删除的另一端。

空栈:不含任何元素的空表。

栈满:存满元素的栈。在动态链式存储实现中,理论上不存在栈满状态,但受系统内存资源限制。

C++中的stack

C++ 中的 stack 可以使用多种标准容器(如 vectordequelist)作为底层容器,默认情况下使用 deque

基本操作与方法接口

定义、初始化和赋值

#include <iostream>
#include <stack>
#include <vector>

int main() 
{
    // 使用默认的 deque 作为底层容器
    std::stack<int> stack1;

    // 使用 vector 作为底层容器
    std::stack<int, std::vector<int>> stack2;
}

stack本身并没有直接在初始化时赋值的标准构造函数,如果非要在初始时赋值,可以借助底层容器来间接实现:

#include <iostream>
#include <stack>
#include <vector>

int main()
{
    // 初始化一个 vector 并赋值
    std::vector<int> v = { 1, 2, 3, 4, 5 };
    // 使用这个 vector 来构造 stack
    std::stack<int, std::vector<int>> stack(v);
}

插入

push():向栈顶插入元素。

stack.push(10);    //向stack的栈顶插入10

访问

top():返回栈顶元素的引用,但不将其从栈中移除。

#include <iostream>
#include <stack>

int main() 
{
    std::stack<int> stack;

    stack.push(10);
    stack.push(20);

    std::cout << stack.top() << std::endl;
}

删除

pop():移除栈顶元素,但不返回该元素的值。

#include <iostream>
#include <stack>

int main()
{
    std::stack<int> stack;

    stack.push(10);
    stack.push(20);
    stack.push(3);
    stack.push(7);

    std::cout << stack.top() << std::endl;

    stack.pop();

    std::cout << stack.top();
}

判空

empty():判断栈是否为空,如果为空则返回 true,否则返回 false

#include <stack>
#include <iostream>

int main()
{
    std::stack<int> stack;

    std::cout << stack.empty() << std::endl;

    stack.push(10);

    std::cout << stack.empty();
}

获取元素个数

size():返回栈中元素的数量。

#include <stack>
#include <iostream>

int main()
{
    std::stack<int> stack;

    stack.push(10);
    stack.push(20);

    std::cout << stack.size();
}

交换

swap():用于交换两个栈的内容。

#include <iostream>
#include <stack>

int main()
{
    // 创建第一个栈并插入元素
    std::stack<int> stack1;
    stack1.push(1);
    stack1.push(2);
    stack1.push(3);

    // 创建第二个栈并插入元素
    std::stack<int> stack2;
    stack2.push(4);
    stack2.push(5);

    // 输出交换前两个栈的栈顶元素
    std::cout << "Before swap: stack1 top = " << stack1.top() << ", stack2 top = " << stack2.top() << std::endl;

    // 交换两个栈的内容
    stack1.swap(stack2);

    // 输出交换后两个栈的栈顶元素
    std::cout << "After swap: stack1 top = " << stack1.top() << ", stack2 top = " << stack2.top() << std::endl;
}

构造新元素

emplace ():用于在栈中直接构造一个新元素,而不是先创建一个临时对象,再将其复制或移动到栈中。这可以提高性能,尤其是对于那些创建和复制成本较高的对象。

未完待续还没有彻底搞清楚与push的区别未完待续

遍历

stack不提供迭代器,但可以采用以下方法遍历栈中的元素:

#include <iostream>
#include <stack>

void printStack(std::stack<int> stack)
{
    while (!stack.empty())      //或者使用“while (stack.size() > 0)”
    {
        std::cout << stack.top() << " ";
        stack.pop();
    }
    std::cout << std::endl;
}

int main()
{
    std::stack<int> stack;

    stack.push(10);
    stack.push(20);
    stack.push(3);
    stack.push(7);

    printStack(stack);
}

参考与引用

std::stack - cppreference.com

C++中stack的用法(超详细,入门必看)_c++ stack-优快云博客

c++ stack用法 入门必看 超详细-优快云博客

c++ stack用法详解-优快云博客

未完待续

写出容器方法的底层实现原理和复杂度。

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值