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

时间:2020-06-22 02:44:30

标签: c++ pointers stack dynamic-memory-allocation dereference

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

对于push(),教授们要求我们“动态创建一个结构”以保存被推送的Data结构的值。我通常了解动态内存分配,因为它与Java中的ArrayList有关,所以我知道他正在要求我们根据需要创建结构,但是我正在努力将各个部分放在一起。假设我在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 
};

2 个答案:

答案 0 :(得分:0)

我想学习,很好。

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

复制数据时,无需为其创建新的内存。在C ++中,了解复制和移动语义,l值,r值和x值之间的差异非常重要。

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

有了这些理解和一些指针算法,您应该能够完成分配

答案 1 :(得分:0)

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

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;