堆叠在 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();
	}
}

输出:

push() 和 pop()

以下是代码截图:

push() 和 pop()

代码说明:

  1. 在我们的代码中包含 iostream 头文件以使用其功能。
  2. 在我们的代码中包含堆栈头文件以使用其功能。
  3. 在我们的代码中包含 std 命名空间,以便使用它的类而不调用它。
  4. 调用main()函数。程序逻辑应该添加到此函数中。
  5. 创建一个堆栈 st 来存储整数值。
  6. 使用 push() 函数将值 10 插入堆栈。
  7. 使用 push() 函数将值 20 插入堆栈。
  8. 使用 push() 函数将值 30 插入堆栈。
  9. 使用 push() 函数将值 40 插入堆栈。
  10. 使用pop()函数从堆栈中删除顶部元素,即40。顶部元素现在变成了30。
  11. 使用pop()函数从堆栈中删除顶部元素,即30。顶部元素现在变成了20。
  12. 使用 while 循环和 empty() 函数检查堆栈是否不为空。 ! 是 NOT 运算符。
  13. 在控制台上打印堆栈的当前内容。
  14. 在堆栈上调用 pop() 函数。
  15. while 循环主体的结束。
  16. 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;
}

输出:

空(),大小(),顶部()

以下是代码截图:

空(),大小(),顶部()

代码说明:

  1. 在我们的代码中包含 iostream 头文件以便使用其功能。
  2. 在我们的代码中包含堆栈头文件以便使用其功能。
  3. 在我们的程序中包含 std 命名空间,以便使用它的类而不调用它。
  4. 创建函数 createStack,我们可以使用它来创建堆栈 mystack。堆栈将保存一组整数。
  5. createStack 函数主体的开头。
  6. 创建 mystack 数据类型的实例并将其命名为 ms。
  7. 使用 while 循环和 empty() 函数检查堆栈是否为空。
  8. while 循环体的开始。
  9. 使用存储在堆栈顶部的 top() 函数。\t 字符将创建一个新选项卡。
  10. 使用pop()函数删除堆栈顶部的元素。
  11. while 循环主体的结束。
  12. 在控制台上打印一个空白行。
  13. createStack 函数主体结束。
  14. 调用 main() 函数。程序逻辑应添加在 main() 函数主体内。
  15. 函数 main() 的主体的开始。
  16. 创建一个堆栈对象st。
  17. 使用push()函数将元素32插入到堆栈中。
  18. 使用push()函数将元素21插入到堆栈中。
  19. 使用push()函数将元素39插入到堆栈中。
  20. 使用push()函数将元素89插入到堆栈中。
  21. 使用push()函数将元素25插入到堆栈中。
  22. 在控制台上打印一些文本。
  23. 调用createStack函数执行上面的插入操作到栈中。
  24. 将堆栈的大小与其他文本一起打印在控制台上。
  25. 在控制台上打印堆栈顶部的元素。
  26. 在控制台上打印一些文本。
  27. 删除堆栈顶部的元素。然后它将返回堆栈中剩余的元素。
  28. 调用createStack函数执行上述操作。
  29. 程序成功完成后必须返回值。
  30. 函数 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();
	}
}

输出:

放置()&交换()

以下是代码截图:

放置()&交换()

代码说明:

  1. 在我们的代码中包含 iostream 头文件以使用其功能。
  2. 在我们的代码中包含堆栈头文件以使用其功能。
  3. 在我们的代码中包含 cstdlib 头文件以使用其功能。
  4. 在我们的代码中包含 std 命名空间,以便使用它的类而不调用它。
  5. 调用 main() 函数。程序逻辑将添加到此函数主体内。
  6. 声明一个名为 st1 的堆栈来存储整数值。
  7. 声明一个名为 st2 的堆栈来存储整数值。
  8. 使用 emplace() 函数将整数 12 插入到名为 st1 的堆栈中。
  9. 使用 emplace() 函数将整数 19 插入到名为 st1 的堆栈中。
  10. 使用 emplace() 函数将整数 20 插入到名为 st2 的堆栈中。
  11. 使用 emplace() 函数将整数 23 插入到名为 st2 的堆栈中。
  12. 使用 swap() 函数交换两个堆栈 st1 和 st2 的内容。堆栈 st1 的内容应移动到堆栈 st2。堆栈 st2 的内容应移动到堆栈 st1。
  13. 在控制台上打印一些文本。
  14. 使用while语句和empty()函数检查堆栈st1是否不为空。
  15. 在控制台上打印堆栈 st1 的内容。在控制台上打印堆栈元素时,“ ”会在堆栈元素之间添加空格。
  16. 对堆栈 st1 执行 pop() 函数,删除顶部元素。
  17. while 语句主体结束。
  18. 在控制台上打印一些文本。endl 是 C++ 结束行的关键字。它将鼠标光标移动到下一行并从那里开始打印。
  19. 使用while语句和empty()函数检查堆栈st2是否不为空。
  20. 在控制台上打印堆栈 st2 的内容。在控制台上打印堆栈元素时,“ ”会在堆栈元素之间添加空格。
  21. 对堆栈 st2 执行 pop() 函数,删除顶部元素。
  22. while 语句主体结束。
  23. 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();  
}

输出:

STL 中的堆栈

以下是代码截图:

STL 中的堆栈

代码说明:

  1. 在我们的代码中包含 iostream 头文件以使用其功能。
  2. 在我们的代码中包含堆栈头文件以使用其功能。
  3. 在我们的代码中包含 cstdlib 头文件以使用其功能。
  4. 在我们的代码中包含 std 命名空间,以便使用它的类而不调用它。
  5. 调用 main() 函数。程序逻辑应添加在此函数主体内。
  6. 声明一个堆栈 st 来存储整数数据。
  7. 将元素 12 添加至堆栈。
  8. 将元素 19 添加至堆栈。
  9. 将元素 20 添加至堆栈。
  10. 在控制台上打印堆栈顶部的元素。
  11. 在控制台上打印堆栈的大小。
  12. 函数 main() 主体结束。

总结

  • 堆栈是一种基于 LIFO(后进先出)技术运行的数据结构。
  • std::stack 只允许从一端添加和删除项目。
  • std::stack 类是一个容器适配器,用于保存类似数据类型的项目。
  • 可以从各种序列容器创建堆栈。
  • 如果不提供容器,则默认使用双端队列容器。
  • push() 函数用于将项目插入堆栈。
  • pop() 函数用于从步骤中删除顶部项目。
  • empty() 函数用于检查堆栈是否为空。