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

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

本文关键字:动态 创建 结构 堆栈 C++      更新时间:2023-10-16

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

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

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

如果这不是解决方案,那么我不知道在推送每个 Data 结构体的值后保留它的最佳方法。我的假设是,当每次调用推送结束时,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++理解复制和移动语义,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;