繁体   English   中英

如何在 C++ 中为堆栈动态创建结构?

[英]How do I dynamically create a struct for a stack in C++?

我正在为 C++ 程序开发堆栈程序。 我已经完成了 isEmpty、peek 和 pop 的工作,但在上学期学习 Java 之后,我正试图找出 C++ 独有的一些东西。 对于这个程序,我们正在创建一个指向名为 Data 的 ADT 结构的指针堆栈,该结构具有两个属性(一个称为 id 的 int 和一个称为 data 的字符串)。

对于 push(),教授们要求我们“动态创建一个结构”来保存被推送的 Data 结构的值。 我通常理解动态 memory 分配,因为它与 Java 中的 ArrayLists 相关,所以我知道他要求我们根据需要创建结构,但我正在努力将这些部分组合在一起。 假设我在 push() 中有一个名为 pushData 的变量,它是一个 Data 结构。 当我调用 push() 时,我使用传递给 push 的值分配 pushData 的属性,并将指向 pushData 的指针添加到堆栈中。

我最初的想法是创建一个并行数组作为 Stack 的一部分,它可以保存推入堆栈的每个 Data 结构的值,并且该结构数组可以与指针数组/堆栈平行。 虽然我认为这可行,但必须有另一种方法,因为教授说我们不能修改 Stack 的属性,这意味着我不能创建一个并行数组来保存这些值。 动态大小的 arrays 是我记得过去教授教授动态分配 memory 概念的唯一方法,所以我不知道如何将它合并到这个特定场景中。

如果这不是解决方案,那么我不知道在推送每个 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 
};

我想学习,它的罚款。

对于堆栈,通常在创建堆栈时创建一个数组。 通常这是 memory 的唯一动态分配。

复制数据时无需为其创建新的 memory。 在 C++ 中,了解复制和移动语义以及 l 值、r 值和 x 值之间的区别很重要。

对于数据结构中的字符串,请记住浅拷贝。

有了这个理解和一些指针算法,你应该能够完成你的任务

这是动态创建结构对象的方法

struct Square
{
    double side;
};

struct Rectangle
{
    double length, width;
};

vector<void*> myBag; //This allows you to have a vector (ArrayList/List) of any type 
vector<int> bagTracker; // 0: square, 1: rectangle we need a companion vector to track down the type of the objects pushed into the vector

Square *square
square = new Square;
square->side = num1;

myBag.push_back(square);
bagTracker.push_back(0);

Rectangle *rectangle
rectangle = new Rectangle;
rectangle->length = num1;
rectangle->width = num2;
                
myBag.push_back(rectangle);
bagTracker.push_back(1);

为了访问对象,您需要reinterpret_cast将任何指针类型转换为任何其他数据类型

Square *square = reinterpret_cast<Square*>(myBag.at(i));
cout << square->side << endl;

同样适用于使用函数

Square *square = reinterpret_cast<Square*>(myBag.at(i));
outputSquare(cout, *square);

希望这能回答或帮助

编辑

我忘了声明Square *squareRectangle *rectangle

用于删除

Square *square = reinterpret_cast<Square*>(myBag.at(i));
delete square;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM