如何在C++中为堆栈动态创建结构?
How do I dynamically create a struct for a stack in C++?
我正在为一个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 *square
和Rectangle *rectangle
用于删除
Square *square = reinterpret_cast<Square*>(myBag.at(i));
delete square;
- 从C++中的数字输入动态创建矩阵
- 如何从QToolBox中动态创建的QLineEdit中获取文本
- 如何在C++中为堆栈动态创建结构?
- 如何使用类型级函数动态创建静态类型?
- 如何在动态创建的CMFCToolbar的工具提示中添加描述?
- 如何设置动态创建的CMFCToolbar的原始状态?
- 我可以动态创建新地图并作为函数参数传递吗?
- 如何在循环中动态创建变量(c++)
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- 在堆或堆栈上分配的动态创建的字符串 - C
- "动态创建的事件处理程序"复选框
- 在字符串数组中动态创建和存储数据
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 无法将动态创建的对象数组从 qml 发送到 c++ 作为方法参数
- 为动态创建的数组使用静态关键字有什么意义吗?
- 有没有办法基于文本文件动态创建对象?
- 从类 c++ 动态创建数组
- 如何在循环中动态创建类对象?
- 动态创建 std::vector 并将其传递给另一个函数的各种方法
- 使用 createComponent 动态创建 QML 对象