【发布时间】:2020-10-11 20:37:34
【问题描述】:
我正在为 C++ 程序开发堆栈程序。我已经完成了 isEmpty、peek 和 pop 的工作,但在上学期学习 Java 之后,我正试图找出 C++ 独有的一些东西。对于这个程序,我们正在创建一个指针堆栈,指向一个名为 Data 的 ADT 结构,它有两个属性(一个称为 id 的 int 和一个称为 data 的字符串)。
对于 push(),教授们要求我们“动态创建一个结构”来保存被推送的 Data 结构的值。我通常理解动态内存分配,因为它与 Java 中的 ArrayLists 有关,所以我知道他要求我们根据需要创建结构,但我正在努力将这些部分组合在一起。假设我在 push() 中有一个名为 pushData 的变量,它是一个 Data 结构。当我调用 push() 时,我使用传递给 push 的值分配 pushData 的属性,并将指向 pushData 的指针添加到堆栈中。
我最初的想法是创建一个并行数组作为 Stack 的一部分,它可以保存推入堆栈的每个 Data 结构的值,并且该结构数组可以与指针数组/堆栈平行。虽然我认为这可行,但必须有另一种方法,因为教授说我们不能修改 Stack 的属性,这意味着我不能创建一个并行数组来保存这些值。动态大小的数组是我记得过去教授讲动态分配内存概念的唯一方法,所以我不知道如何将它融入到这个特定的场景中。
如果这不是解决方案,那么我不知道在推送每个 Data 结构的值后保持它的最佳方法。我的假设是,当每次对 push 的调用完成时,pushData 结构将被删除,然后 push() 将重新创建 pushData 变量并在每次再次调用时为其赋予一个新值...
提前感谢您提供的任何帮助。我对自己感到很沮丧,因为我在这最后一种方法上感到非常困惑。提前感谢任何能够提供帮助的人。
我们得到了:
struct Data
{
int id;
string data;
};
class Stack
{
public:
/*
* write all your public method prototypes here
*/
private:
/* write all your private method prototypes here */
// these are the only attributes you need. do not modify them or add any
int top; // this is your top index
Data *stack[STACK_SIZE]; // this is your stack, it is an array of Data pointers
};
【问题讨论】:
-
听起来更像 C 但如果是 C++ 我会模仿 std::stack 的接口。您的结构是否有复制构造函数(或者是 PoD 类型)?如果您想手动使用 new/delete,那么您必须跟踪这些指针。
-
“最好的方法”是使用
<stack>。让学生重新实现标准库(很糟糕),通过使用标准库将他们限制为 not 确实对每个人都不利。您永远不必自己实现基本数据结构,尤其是不是那些动态分配内存的结构。这就是标准库 为 的用途,以及您应该学习的内容... -
@DevSolar,我确信在某些情况下知道如何实现
stack很重要,而在某些情况下,只知道如何使用它很重要。 -
教授给你的代码是什么样的?
-
@MarquisofLorne 正如我所说,将太多的 C++ 课程与普通的 Java 或 Python 课程进行比较。太多 1970 年的思维模式在那里继续,导致 C++ 仍然享有复杂的名声,而实际上情况恰恰相反。教他们每个结构是什么,在哪里可以找到它们,以及如何使用它们。我不同意实施它们的实践在那个级别上是有用的。此外,本土结构通常也不能很好地与
<algorithm>配合使用......
标签: c++ pointers stack dynamic-memory-allocation dereference