C++ 嵌套结构和指针
我正在学习嵌套结构,遇到了以下代码:C++ 嵌套结构和指针,c++,pointers,struct,C++,Pointers,Struct,我正在学习嵌套结构,遇到了以下代码: // Stack.h #ifndef STACK_H #define STACK_H struct Stack{ struct Link{ void* data; Link* next; void initialize(void* dat, Link* nxt); }* head; void initialize(); void push(void* dat); vo
// Stack.h
#ifndef STACK_H
#define STACK_H
struct Stack{
struct Link{
void* data;
Link* next;
void initialize(void* dat, Link* nxt);
}* head;
void initialize();
void push(void* dat);
void* peek();
void* pop();
void cleanup();
};
#endif // STACK_H
链接结构在Stack的范围内,要访问链接,我必须使用Stack::Link
我对在}之后声明的指针头有点困惑,以关闭链接结构
这是否意味着堆栈范围内有一个名为head的链接指针变量
将头部指针定义为以下内容的效果是什么:
};
Link* head;
vs
没有区别。这两个声明都会导致类型为
Stack::Link*
的Stack::head
成员
这是否意味着在堆栈
范围内有一个名为head的链接
指针变量
是的,完全正确
至于你的第二个问题,这两种类型的声明在语义上没有区别。这只是语义的简写。就像我们如何使用
+=
。
是的,你有一个局部指针变量
struct Stack{
struct Link{
void* data;
Link* next;
void initialize(void* dat, Link* nxt);
};
Link* head; //Same as code as in your program
void initialize();
void push(void* dat);
void* peek();
void* pop();
void cleanup();
};
旁注:您真的想使用链表来实现堆栈吗?我只是在学习C++,这就是我在数据结构和算法中使用过的内容。class@H2CO3您建议如何实现堆栈?首先,
std::vector
可以用作堆栈,因此实际上不需要实现。但是,如果您想这样做,可以使用数组或封装的std::vector
。由于您将仅从末尾插入和删除,因此对于数组和向量,这是O(1)
。相反,遍历链接列表然后从末尾删除是O(n)
(除非您足够聪明,可以插入到头部,即向后使用列表)。此外,数组和向量使用一个连续的内存块,因此它们更紧凑,并且它们还可以防止%遍历指针,从而降低缓存未命中的可能性。我建议你看一下比亚恩·斯特劳斯特鲁普(Bjarne Stroustrup)在YouTube上的题为“为什么你应该避免链接列表”的演讲。
struct Stack{
struct Link{
void* data;
Link* next;
void initialize(void* dat, Link* nxt);
};
Link* head; //Same as code as in your program
void initialize();
void push(void* dat);
void* peek();
void* pop();
void cleanup();
};