C++ STL 中的堆栈示例
什么是 std::stack?
堆栈是一种基于 LIFO(后进先出)技术的数据结构。 std::stack 只允许从一端添加和删除元素。
std::stack 类是一个容器适配器。容器对象保存类似数据类型的数据。您可以从各种序列容器创建堆栈。如果没有提供容器,则默认使用双端队列容器。容器适配器不支持迭代器,因此不能用于操作数据。
在本 C++ 教程中,您将学习
- 什么是std::stack?
- 堆栈语法
- 会员类型
- 堆栈中的操作
- 堆栈实现
- push() 和 pop()
- empty(), size(), top()
- emplace() 和 swap()
- STL 中的堆栈
堆栈语法
要创建堆栈,我们必须在代码中包含
template <class Type, class Container = deque<Type> > class stack;
- 类型 – 是包含在 std::stack 中的元素的类型。它可以是任何有效的 C++ 类型,甚至是用户定义的类型。
- 容器 – 是底层容器对象的类型。
成员类型
以下是堆栈成员类型:
- value_type- 第一个模板参数,T。它表示元素类型。
- container_type- 第二个模板参数,Container。它表示底层容器类型。
- size_type- 无符号整数类型。
堆栈中的操作
C++ 栈支持以下基本操作:
- push – 将项目添加/推送到堆栈中。
- pop – 从堆栈中移除/弹出一个项目。
- peek – 返回堆栈的顶部项目而不删除它。
- isFull – 检查堆栈是否已满。
- isEmpty – 检查堆栈是否为空。
堆栈实现
步骤 1) 我们最初有一个空堆栈。空堆栈的顶部设置为 -1。
步骤 2) 接下来,我们将元素 5 压入堆栈。栈顶将指向元素 5。
步骤 3) 接下来,我们将元素 50 推入堆栈。栈顶移动并指向元素 50。
第 4 步) 然后我们执行了一个弹出操作,从堆栈中删除了顶部元素。元素 50 从堆栈中弹出。栈顶现在指向元素 5。
push() 和 pop()
stack::push() 函数将新项目添加到堆栈顶部。插入后堆栈大小增加 1。该函数采用以下语法:
stack.push(value)
该值是要插入堆栈的项目。
stack::pop() 函数删除栈顶元素。这是堆栈的最新项目。删除后堆栈大小减 1。下面是函数语法:
stack.pop()
该函数不接受任何参数。
示例 1:
#include <iostream> #include <stack> using namespace std; int main() { stack<int> st; st.push(10); st.push(20); st.push(30); st.push(40); st.pop(); st.pop(); while (!st.empty()) { cout << ' ' << st.top(); st.pop(); } }
输出:
下面是代码截图:
代码说明:
- 在我们的代码中包含 iostream 头文件以使用其功能。
- 在我们的代码中包含堆栈头文件以使用其功能。
- 在我们的代码中包含 std 命名空间以使用它的类而不调用它。
- 调用 main() 函数。应在此函数中添加程序逻辑。
- 创建一个堆栈 st 来存储整数值。
- 使用 push() 函数将值 10 插入堆栈。
- 使用 push() 函数将值 20 插入堆栈。
- 使用 push() 函数将值 30 插入堆栈。
- 使用 push() 函数将值 40 插入堆栈。
- 使用pop()函数将栈顶元素移除,即40。现在栈顶元素变为30。
- 使用pop()函数将栈顶元素移出栈顶,即30。现在栈顶元素变为20。
- 使用 while 循环和 empty() 函数检查堆栈是否为空。这 !是 NOT 运算符。
- 在控制台上打印堆栈的当前内容。
- 调用栈上的pop() 函数。
- while 循环主体的结尾。
- main() 函数体结束。
空(),大小(),顶部()
堆栈具有内置函数,您可以使用这些函数来处理堆栈及其值。其中包括:
- empty() - 检查堆栈是否为空。
- size()- 返回栈的大小,即栈中元素的个数。
- top()- 访问栈顶元素。
示例 2:
#include <iostream> #include <stack> using namespace std; void createStack(stack <int> mystack) { stack <int> ms = mystack; while (!ms.empty()) { cout << '\t' << ms.top(); ms.pop(); } cout << '\n'; } int main() { stack <int> st; st.push(32); st.push(21); st.push(39); st.push(89); st.push(25); cout << "The stack st is: "; createStack(st); cout << "\n st.size() : " << st.size(); cout << "\n st.top() : " << st.top(); cout << "\n st.pop() : "; st.pop(); createStack(st); return 0; }
输出:
下面是代码截图:
代码说明:
- 在我们的代码中包含 iostream 头文件以便使用它的功能。
- 在我们的代码中包含堆栈头文件以便使用它的功能。
- 在我们的程序中包含 std 命名空间,以便在不调用它的情况下使用它的类。
- 创建函数createStack,我们可以使用它来创建堆栈mystack。堆栈将保存一组整数。
- createStack 函数体的开头。
- 创建 mystack 数据类型的实例并将其命名为 ms。
- 使用 while 循环和 empty() 函数检查堆栈是否为空。
- while 循环体的开始。
- 使用存储在栈顶的 top() 函数。 \t 字符将创建一个新选项卡。
- 使用 pop() 函数删除栈顶元素。
- while 循环主体的结尾。
- 在控制台上打印一个空行。
- createStack 函数主体的结尾。
- 调用 main() 函数。程序逻辑应添加到 main() 函数的主体中。
- main() 函数体的开始。
- 创建一个堆栈对象 st。
- 使用 push() 函数将元素 32 插入堆栈。
- 使用 push() 函数将元素 21 插入堆栈。
- 使用 push() 函数将元素 39 插入堆栈。
- 使用 push() 函数将元素 89 插入堆栈。
- 使用 push() 函数将元素 25 插入堆栈。
- 在控制台上打印一些文本。
- 调用createStack函数执行上述插入操作入栈。
- 在控制台上与其他文本一起打印堆栈的大小。
- 在控制台上打印堆栈顶部的元素。
- 在控制台上打印一些文本。
- 删除堆栈顶部的元素。然后它将返回堆栈中剩余的元素。
- 调用createStack函数执行上述操作。
- 程序必须在成功完成后返回值。
- main() 函数体结束。
emplace() 和 swap()
这些是其他内置的堆栈函数:
- emplace()- 构造然后将新元素插入堆栈顶部。
- swap()- 与另一个堆栈的内容交换堆栈内容。
示例 3:
#include <iostream> #include <stack> #include <cstdlib> using namespace std; int main() { stack<int> st1; stack<int> st2; st1.emplace(12); st1.emplace(19); st2.emplace(20); st2.emplace(23); st1.swap(st2); cout << "st1 = "; while (!st1.empty()) { cout << st1.top() << " "; st1.pop(); } cout << endl << "st2 = "; while (!st2.empty()) { cout << st2.top() << " "; st2.pop(); } }
输出:
下面是代码截图:
代码说明:
- 在我们的代码中包含 iostream 头文件以使用其功能。
- 在我们的代码中包含堆栈头文件以使用其功能。
- 在我们的代码中包含 cstdlib 头文件以使用其功能。
- 在我们的代码中包含 std 命名空间以使用它的类而不调用它。
- 调用 main() 函数。程序逻辑将添加到此函数的主体中。
- 声明一个名为 st1 的堆栈来存储整数值。
- 声明一个名为 st2 的堆栈来存储整数值。
- 使用 emplace() 函数将整数 12 插入名为 st1 的堆栈中。
- 使用 emplace() 函数将整数 19 插入名为 st1 的堆栈中。
- 使用 emplace() 函数将整数 20 插入名为 st2 的堆栈中。
- 使用 emplace() 函数将整数 23 插入名为 st2 的堆栈中。
- 使用 swap() 函数交换两个堆栈 st1 和 st2 的内容。堆栈 st1 的内容应该移动到堆栈 st2。堆栈 st2 的内容应移动到堆栈 st1。
- 在控制台上打印一些文本。
- 使用while语句和empty()函数检查堆栈st1是否为空。
- 在控制台上打印堆栈 st1 的内容。当在控制台上打印堆栈元素时,“”会在堆栈元素之间添加空间。
- 在栈 st1 上执行 pop() 函数来移除顶部元素。
- while 语句主体的结尾。
- 在控制台上打印一些文本。 endl 是结束行的 C++ 关键字。它将鼠标光标移动到下一行以从那里开始打印。
- 使用while语句和empty()函数检查堆栈st2是否不为空。
- 在控制台上打印堆栈 st2 的内容。当在控制台上打印堆栈元素时,“”会在堆栈元素之间添加空间。
- 在栈 st2 上执行 pop() 函数以移除顶部元素。
- while 语句主体的结尾。
- main() 函数体的结尾。
STL 中的堆栈
STL(标准模板库)带有提供通用 C++ 数据结构的模板类。因此,堆栈也可以在 STL 中实现。我们只需将这个库包含在我们的代码中并使用它来定义一个堆栈。
stack<T> st;
上面的语法为数据类型 T 的元素声明了一个栈 st。
示例 3:
#include <iostream> #include <stack> #include <cstdlib> using namespace std; int main() { stack<int> st; st.push(12); st.push(19); st.push(20); cout << st.top(); cout << st.size(); }
输出:
下面是代码截图:
代码说明:
- 在我们的代码中包含 iostream 头文件以使用其功能。
- 在我们的代码中包含堆栈头文件以使用其功能。
- 在我们的代码中包含 cstdlib 头文件以使用其功能。
- 在我们的代码中包含 std 命名空间以使用它的类而不调用它。
- 调用 main() 函数。程序逻辑应添加到此函数的主体中。
- 声明一个堆栈 st 来存储整数数据。
- 将元素 12 添加到堆栈中。
- 将元素 19 添加到堆栈中。
- 将元素 20 添加到堆栈中。
- 在控制台上打印堆栈顶部的元素。
- 在控制台上打印堆栈的大小。
- 函数 main() 的主体结束。
总结:
- 堆栈是一种基于 LIFO(后进先出)技术运行的数据结构。
- std::stack 只允许从一端添加和删除项目。
- std::stack 类是一个容器适配器,包含类似数据类型的项。
- 可以从各种序列容器创建堆栈。
- 如果不提供容器,默认使用双端队列容器。
- push() 函数用于将项目插入堆栈。
- pop() 函数用于从步骤中删除顶部项目。
- empty() 函数用于检查堆栈是否为空。
C语言