C++ 栈

C++ 栈

栈(stack)按照特定的顺序(称为后进先出,即 LIFO)存储多个元素。

LIFO 是 "Last In, First Out"(后进先出)的缩写。要理解 LIFO,可以想象一堆煎饼,煎饼是从顶部添加和移除的。因此,当你移除一块煎饼时,它总是你最后添加的那块。在计算机科学和编程中,这种组织元素的方式被称为 LIFO。

向量不同,栈中的元素不能通过索引号访问。由于元素是从栈顶添加和移除的,因此你只能访问栈顶的元素。

要使用栈,必须包含 <stack> 头文件:

// 包含栈库
#include <stack>

创建栈

要创建一个栈,可以使用 stack 关键字,并在尖括号 <> 内指定要存储的值的类型,然后是栈的名称,格式为:

stack<类型> 栈名

实例

// 创建一个名为 cars 的字符串栈
stack<string> cars;

注意:栈的类型(本例中为 string)一旦声明后就不能更改。

注意:与向量不同,你不能在声明栈时直接添加元素:

实例

stack<string> cars = {"Volvo", "BMW", "Ford", "Tesla"};

添加元素

要向栈中添加元素,可以使用 .push() 函数:

实例

// 创建一个名为 cars 的字符串栈
stack<string> cars;

// 向栈中添加元素
cars.push("Volvo");
cars.push("BMW");
cars.push("Ford");
cars.push("Tesla");

此时栈的结构如下(记住,最后添加的元素是栈顶元素):

Tesla (栈顶元素)
Ford
BMW
Volvo

访问栈元素

与数组和向量不同,你不能通过索引号来访问栈元素。

在栈中,你只能访问栈顶元素,这可以通过 .top() 函数实现:

实例

// 访问栈顶元素
cout << cars.top();  // 输出 "Tesla"

亲自试一试

修改栈顶元素

你也可以使用 .top() 函数来修改栈顶元素的值:

实例

// 修改栈顶元素的值
cars.top() = "Audi";

// 访问栈顶元素
cout << cars.top();  // 现在输出 "Audi" 而非 "Tesla"

亲自试一试

移除元素

你可以使用 .pop() 函数从栈中移除一个元素。

这将移除栈中最后添加的元素:

实例

// 创建一个名为 cars 的字符串栈
stack<string> cars;

// 向栈中添加元素
cars.push("Volvo");
cars.push("BMW");
cars.push("Ford");
cars.push("Tesla");

// 移除最后添加的元素(Tesla)
cars.pop();

// 访问栈顶元素(现在是 Ford)
cout << cars.top();

亲自试一试

获取栈的大小

要了解栈中有多少个元素,可以使用 .size() 函数:

实例

cout << cars.size();

亲自试一试

检查栈是否为空

可以使用 .empty() 函数来判断栈是否为空。

.empty() 函数在栈为空时返回 1(true),在栈包含元素时返回 0(false):

实例

stack<string> cars;
cout << cars.empty(); // 输出 1(栈为空)

亲自试一试

实例

stack<string> cars;

cars.push("Volvo");
cars.push("BMW");
cars.push("Ford");
cars.push("Tesla");

cout << cars.empty();  // 输出 0(栈不为空)

亲自试一试

栈与队列

栈通常与队列一起提及,队列是另一种类似的数据结构,将在下一页进行介绍。