动态多栈是一种非常出色的数据结构,它具有在多个栈中存储元素的能力,栈的数量是不断变化的。只使用一个数据结构来实现K个栈可能是一项艰巨的任务。在本教程中,我们将探讨两种不同的方法来使用C++执行动态多栈(K个栈)。第一种方法使用一个数组来存储元素,还有两个额外的数组来监视栈的最顶端和下一个索引。第二种方法使用一个节点向量来存储元素,还有一个向量来跟踪每个栈的头部。
本文将重点介绍如何在C++中使用一种数据结构来执行动态多堆栈。
方法
方法一 - 使用一个数组来存储数据结构的元素,并使用两个辅助数组来存储每个栈的顶部元素和数组中下一个可用空槽的索引。
方法2 - 使用双向链表来存储数据结构的元素,并使用向量来存储每个栈的头节点。
语法
给定的语法是在C++中声明名为KStacks的类。该类具有以下成员函数或方法-
一个构造方法 KStacks,它接受两个参数 k 和 n。
名为push的方法,它接受两个参数item和sn,用于将元素插入堆栈sn中。
一个名为pop的方法,它接受一个参数sn,并用于从堆栈sn中移除一个元素。
名为 is_empty 的方法,它采用单个参数 sn 并返回一个布尔值,指示堆栈 sn 是否为空。
名为 is_full 的方法,它返回一个布尔值,指示整个数据结构是否已满。
class KStacks { public: KStacks(int k, int n); // Constructor void push(int item, int sn); // Insert an element into stack 'sn' int pop(int sn); // Remove an element from stack 'sn' bool is_empty(int sn); // Check if stack 'sn' is empty bool is_full(); // Check if the entire data structure is full };
算法
以下是使用单个数据结构实现K堆动态多重背包的算法:
步骤 1 - 首先创建一个数据结构,其中包含一个大小为 n 的数组来存储元素,以及两个大小为 k 的辅助数组。一个数组将存储有关每个堆栈最顶层元素的信息,而另一个数组将跟踪主数组中的下一个可用索引。
第 2 步 - 接下来,我们使用值 -1 和 0 调用父数组及其对应的数组。
第 3 步 - 使用 cart() 函数,我们可以将对象添加到特定堆栈中。该函数需要两个输入:要添加的项目和组号。在添加项目之前,push() 函数通过将下一个可用索引值与 n 进行比较来检查数据结构是否已满。如果仍有空间,则将该项目添加到下一个可用索引,并更新下一个可用索引的值。
步骤 4 - pop() 函数用于从特定堆栈中删除项目,以组号作为其参数。 pop() 函数通过将父数组值与 -1 进行比较来检查堆栈是否为空。如果堆栈不为空,则 pop() 函数会从堆栈中删除最顶层元素,并更新父数组值以指向新的最顶层元素。
第五步 - 要检查特定的堆栈是否为空,我们使用is_empty()函数,并将组号作为其参数。该函数检查父数组的值是否等于-1。
第 6 步 - 要检查所有堆栈是否已满,我们使用 is_full() 函数,该函数检查下一个可用索引值是否等于 n。
方法一
我们将采用一种方法,其中涉及利用一个数组来保留元素,以及两个附加数组来监视堆栈的最顶层和后续索引。虽然这是一个简单有效的解决方案,但它需要预先定义预定数量的堆栈。
下面是相同的程序代码。
示例
该代码代表 K Stacks 数据结构的实现,它是堆栈数据结构的动态解释,允许在单个数组中容纳多个堆栈。
KStacks类包含三个成员变量−
arr − 一个作为所有栈元素存储的数组。
top − 一个用作每个栈顶部存储的数组。
next − 一个用作存储数组中下一个可用位置的数组。
push − 将一个元素插入到指定的堆栈中。
pop − 从指定的堆栈中移除一个元素。
is_empty − 验证指定的堆栈是否为空。
is_full - 验证数组是否完全被占用。
在main函数中,生成了KStacks类的实例,以栈的数量和数组的大小作为输入参数。然后,元素被推入三个不同的堆栈中。最后,删除并显示每个堆栈的顶部元素。
#include <iostream> #include <vector> #include<climits> using namespace std; class KStacks { private: int *arr; int *top; int *next; int n, k; public: KStacks(int k, int n) { this->k = k; this->n = n; arr = new int[n]; top = new int[k]; next = new int[n]; for (int i = 0; i < k; i++) top[i] = -1; for (int i = 0; i < n - 1; i++) next[i] = i + 1; next[n - 1] = -1; } void push(int item, int sn) { if (is_full()) { cout << "Stack Overflow\n"; return; } int i = next[sn]; next[sn] = top[sn]; top[sn] = i; arr[i] = item; } int pop(int sn) { if (is_empty(sn)) { cout << "Stack Underflow\n"; return INT_MAX; } int i = top[sn]; top[sn] = next[i]; next[i] = i; return arr[i]; } bool is_empty(int sn) { return top[sn] == -1; } bool is_full() { return next[0] == -1; } }; int main() { KStacks ks(3, 10); ks.push(15, 2); ks.push(45, 2); ks.push(17, 1); ks.push(49, 1); ks.push(39, 1); ks.push(11, 0); ks.push(9, 0); ks.push(7, 0); cout << "Popped element from stack 2: " << ks.pop(2) << endl; cout << "Popped element from stack 1: " << ks.pop(1) << endl; cout << "Popped element from stack 0: " << ks.pop(0) << endl; return 0; }
输出
Stack Overflow Stack Overflow Popped element from stack 2: Stack Underflow 2147483647 Popped element from stack 1: 39 Popped element from stack 0: 11
方法二
我们将采用一种方法,其中使用节点向量来存储元素。这种方法应该由一个用于维护每个堆栈头部的向量来补充。事实证明,我们的方法是一种更灵活的解决方案,可以容纳经历动态变化的可变数量的堆栈。然而,这种方法可能会带来更重的内存负担并带来更多的开销。
示例 2
该代码构成了一个 C++ 程序,该程序实现了称为“KStacks”的数据架构。这种数据结构通过应用一种称为“固定划分”的方法,可以在单个数组中存储多个堆栈。
“KStacks”类包含一系列成员函数,包括“push”、“pop”、“is_empty”和“is_full”。 “推入”操作允许将项目添加到指定的堆栈,而“弹出”功能则从指定的堆栈中消除顶部项目。
如果指定的堆栈未被占用,则“is_empty”函数返回true,如果所有堆栈都完全被占用,则“is_full”函数返回true。在主函数中,建立了三个容量为10的堆栈,并从每个堆栈中推入和弹出项目。最终,弹出的项目将显示在控制台上。
代码
#include <iostream> #include <vector> #include<climits> using namespace std; class Node { public: int data; int prev; int next; }; class KStacks { private: vector<Node> arr; vector<int> head; int n, k; int free; public: KStacks(int k, int n) { this->k = k; this->n = n; arr.resize(n); head.resize(k, -1); free = 0; for (int i = 0; i < n - 1; i++) arr[i].next = i + 1; arr[n - 1].next = -1; } void push(int item, int sn) { if (is_full()) { cout << "Stack Overflow\n"; return; } int i = free; free = arr[i].next; arr[i].data = item; arr[i].prev = head[sn]; arr[i].next = -1; if (head[sn] != -1) arr[head[sn]].next = i; head[sn] = i; } int pop(int sn) { if (is_empty(sn)) { cout << "Stack Underflow\n"; return INT_MAX; } int i = head[sn]; head[sn] = arr[i].prev; if (head[sn] != -1) arr[head[sn]].next = -1; arr[i].next = free; free = i; return arr[i].data; } bool is_empty(int sn) { return head[sn] == -1; } bool is_full() { return free == -1; } }; int main() { KStacks ks(3, 10); ks.push(15, 2); ks.push(45, 2); ks.push(17, 1); ks.push(49, 1); ks.push(39, 1); ks.push(11, 0); ks.push(9, 0); ks.push(7, 0); cout << "Popped element from stack 2: " << ks.pop(2) <<endl; cout << "Popped element from stack 1: " << ks.pop(1) <<endl; cout << "Popped element from stack 0: " << ks.pop(0) <<endl; return 0; }
输出
Popped element from stack 2: 45 Popped element from stack 1: 39 Popped element from stack 0: 7
结论
在本文中,我们讨论了使用 C++ 中的单个数据结构创建动态多堆栈的两种不同方法。两种方法都有其优点和缺点,选择使用哪一种方法将取决于当前问题的具体需求。
以上是使用一个数据结构实现多个栈(K个栈)的详细内容。更多信息请关注PHP中文网其他相关文章!

在C 中处理XML数据结构可以使用TinyXML或pugixml库。1)使用pugixml库解析和生成XML文件。2)处理复杂的嵌套XML元素,如书籍信息。3)优化XML处理代码,建议使用高效库和流式解析。通过这些步骤,可以高效处理XML数据。

C 在性能优化方面仍然占据主导地位,因为其低级内存管理和高效执行能力使其在游戏开发、金融交易系统和嵌入式系统中不可或缺。具体表现为:1)在游戏开发中,C 的低级内存管理和高效执行能力使得它成为游戏引擎开发的首选语言;2)在金融交易系统中,C 的性能优势确保了极低的延迟和高吞吐量;3)在嵌入式系统中,C 的低级内存管理和高效执行能力使得它在资源有限的环境中非常受欢迎。

C XML框架的选择应基于项目需求。1)TinyXML适合资源受限环境,2)pugixml适用于高性能需求,3)Xerces-C 支持复杂的XMLSchema验证,选择时需考虑性能、易用性和许可证。

C#适合需要开发效率和类型安全的项目,而C 适合需要高性能和硬件控制的项目。 1)C#提供垃圾回收和LINQ,适用于企业应用和Windows开发。 2)C 以高性能和底层控制着称,广泛用于游戏和系统编程。

C 代码优化可以通过以下策略实现:1.手动管理内存以优化使用;2.编写符合编译器优化规则的代码;3.选择合适的算法和数据结构;4.使用内联函数减少调用开销;5.应用模板元编程在编译时优化;6.避免不必要的拷贝,使用移动语义和引用参数;7.正确使用const帮助编译器优化;8.选择合适的数据结构,如std::vector。

C 中的volatile关键字用于告知编译器变量值可能在代码控制之外被改变,因此不能对其进行优化。1)它常用于读取可能被硬件或中断服务程序修改的变量,如传感器状态。2)volatile不能保证多线程安全,应使用互斥锁或原子操作。3)使用volatile可能导致性能slight下降,但确保程序正确性。

在C 中测量线程性能可以使用标准库中的计时工具、性能分析工具和自定义计时器。1.使用库测量执行时间。2.使用gprof进行性能分析,步骤包括编译时添加-pg选项、运行程序生成gmon.out文件、生成性能报告。3.使用Valgrind的Callgrind模块进行更详细的分析,步骤包括运行程序生成callgrind.out文件、使用kcachegrind查看结果。4.自定义计时器可灵活测量特定代码段的执行时间。这些方法帮助全面了解线程性能,并优化代码。

使用C 中的chrono库可以让你更加精确地控制时间和时间间隔,让我们来探讨一下这个库的魅力所在吧。C 的chrono库是标准库的一部分,它提供了一种现代化的方式来处理时间和时间间隔。对于那些曾经饱受time.h和ctime折磨的程序员来说,chrono无疑是一个福音。它不仅提高了代码的可读性和可维护性,还提供了更高的精度和灵活性。让我们从基础开始,chrono库主要包括以下几个关键组件:std::chrono::system_clock:表示系统时钟,用于获取当前时间。std::chron


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版
中文版,非常好用

Dreamweaver Mac版
视觉化网页开发工具