在本文中,我们将深入探讨C++中的stack容器,包括它的基本概念、功能和实际应用。我们将通过易于理解的代码示例来详细阐述这些概念。

1. stack容器简介

stack(栈)是一种简单的线性数据结构,具有“先进后出”(LIFO,Last In First Out)的特点。这意味着最后插入stack的元素将首先被移除。在C++中,stack容器是基于其他容器实现的,通常是deque(双端队列)或vector(向量)。

stack容器的主要操作有四个:push(压入元素)、pop(弹出元素)、top(访问栈顶元素)和empty(检查栈是否为空)。我们将在后面的章节中详细介绍这些操作。

2. 创建和初始化stack

要使用stack容器,您需要包含头文件。创建一个stack时,可以选择基于deque(默认)或vector实现。以下是创建stack的示例代码

#include // 基于deque的stackstd::stack s1;// 基于vector的stackstd::stack> s2;3. 常用操作3.1 push

将元素压入stack的顶部。以下代码示例展示了如何使用push操作:

std::stack s;s.push(10);s.push(20);s.push(30);

此时,栈顶元素为30。

3.2 pop

从stack顶部移除元素。注意,pop操作不会返回被移除的元素。以下代码示例展示了如何使用pop操作:

std::stack s;s.push(10);s.push(20);s.push(30);s.pop(); // 从栈中移除30

此时,栈顶元素为20。

3.3 top

访问stack顶部的元素,但不从栈中移除。以下代码示例展示了如何使用top操作:

std::stack s;s.push(10);s.push(20);s.push(30);int top = s.top(); // top的值为30,但30仍然在栈中3.4 empty

检查stack是否为空。以下代码示例展示了如何使用empty操作:

std::stack s;bool isEmpty = s.empty(); // isEmpty的值为true,因为栈为空

4. stack的实际应用

stack在实际应用中有很多用途,例如在括号匹配、表达式计算和深度优先搜索(DFS)等场景中。以下是一个简单的示例,展示如何使用stack检查字符串中的括号是否匹配:

#include #include #include bool isValidParenthesis(const std::string& str) { std::stack s; for (char ch : str) { if (ch == '(' || ch == '[' || ch == '{') { s.push(ch); } else { if (s.empty()) return false; char top = s.top(); if ((ch == ')' && top == '(') || (ch == ']' && top == '[') || (ch == '}' && top == '{')) { s.pop(); } else { return false; } } } return s.empty();}int main() { std::string str = "{[()]}"; std::cout << (isValidParenthesis(str) ? "匹配" : "不匹配") << std::endl; return 0;}

#夏日生活打卡季#