我正在制作一个需要使用两个堆栈的C程序。一个人需要持有角色,另一个需要持有双打。我有两个结构,节点和堆栈:
struct node {
double value;
struct node *next;
struct node *prev;
};
struct stack {
struct node *last;
struct node *curr;
};
问题在于我需要每种类型中的一种。我唯一能想到的是有两个独立的结构(即char_node,double_node,char_stack,double_stack)。如果这是C ++我会使用模板,但当然我不能用C。
我记得可以用于此的一件事是一个无效指针。那会有用吗,它会实用吗?
答案 0 :(得分:5)
你可以使用联盟。
这里有关于unions的一些信息。
答案 1 :(得分:3)
如果您真的想将链接列表用作堆栈,则不需要next和prev,就在下一步。你也不需要尾部/头部指针(示例代码中的“last”)。在堆栈上你只关心顶部元素。
如果要实现堆栈来保存char和double等类型,为什么不声明每种类型的数组并保存指向数组中最后一个有效元素的指针?然后,当您想要推入数组时,您可以递增指针并设置值。要弹出,请执行相反操作:获取值并减少指针。使用数组意味着一次性分配您可能需要的所有内存,而不是每次要将新节点推送到堆栈时。
答案 2 :(得分:2)
为什么不使用工会?
struct node {
union {
double d_value;
char c_value;
} val;
struct node *next;
struct node *prev;
};
答案 3 :(得分:1)
好的,但您显示的节点结构似乎属于双链表,而不是堆栈。你真的在想堆叠吗?您显示的动态分配的链接节点链将会在一瞬间消耗您的记忆。
我建议你重新考虑这个的基础设计。你应该使用更有效的内存(也许我不知道你的特殊情况,但这是一般方法。这实际上可能导致2个不同类型的对象的单独堆栈,以保持数据对齐(你不会喜欢1字节字符与4字节长混合,例如在普通存储区中。)
但根据我对此的经验,这只是我的观点,可能对您的情况有用;)。
答案 4 :(得分:1)
如果每个堆栈只需要保存一个数据类型,那么unions和void指针都是过度的。制作一个DoubleStackNode
和一个CharStackNode
- 无论如何,这就是C ++模板(即StackNode<T>
)在幕后所做的事情。
不要试图制造一些超级通用的全能解决方案。您只需要两种类型的堆栈。
你可以使用union,但这样做会给你的char栈增加大量的空间开销。