堆叠在 C++ STL 示例
什么是 std::stack?
堆栈是一种基于 LIFO(后进先出)技术的数据结构。std::stack 只允许从一端添加和删除元素。
std::stack 类是一个容器适配器。容器对象保存类似数据类型的数据。您可以从各种序列容器创建堆栈。如果没有提供容器,则默认使用双端队列容器。容器适配器不支持迭代器,因此不能用于操作数据。
堆栈语法
要创建堆栈,我们必须包括在我们的代码中引入头文件。然后我们使用这个语法来定义 std::stack:
template <class Type, class Container = deque<Type> > class stack;
- 类型 – 是 std::stack 中包含的元素的类型。它可以是任何有效的 C++ 类型甚至是用户定义的类型。
- 容器 – 是底层容器对象的类型。
会员类型
以下是堆栈成员类型:
- value_type- 第一个模板参数,T。它表示元素类型。
- container_type- 第二个模板参数,Container。它表示底层容器类型。
- size_type- 无符号整数类型。
Opera堆栈中的
A C++ stack支持以下基本操作:
- 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;
上述语法声明了一个堆栈 st,其中包含数据类型 T 的元素。
例如4:
#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() 函数用于检查堆栈是否为空。