我正在尝试使用链表实现堆栈类,这是我的stack.h
// File: Stack.h
#ifndef STACK_H
#define STACK_H
class Stack
{
private:
struct linklst{
int num;
int* next;
};
linklst* top;
public:
Stack();
~Stack();
void push(int i);
int pop();
bool isempty();
};
#endif
和我的堆栈.cpp
// Stack.cpp
#include"Stack.h"
using namespace std;
Stack::Stack(){
top = new linklst();
top->num = -1;
top->next = nullptr;
};
Stack::~Stack() {
linklst * r = new linklst();
while (true)
{
r = top;
top = top->next;
delete r;
}
delete top;
};
void Stack::push(int i){
linklst * r = new linklst();
r->num = i;
r->next = top;
top = r;
};
int Stack::pop(){
if (!isempty){
linklst * r = top;
top = top->next;
int x = r->num;
delete r;
return x;
}
};
bool Stack::isempty(){
return (top->next == nullptr);
};
我的问题是在cpp文件中,每当我尝试将top分配给r时,例如在push函数中r-> next = top; 我得到这个错误“类型为stack :: linllst *的值不能分配给int *类型的实体”
有谁知道我做错了什么?
任何帮助将不胜感激 感谢
答案 0 :(得分:5)
从
更改结构定义struct linklst{
int num;
int* next;
};
到
struct linklst{
int num;
linklst* next;
};
尽管如此,即使在此更改后,您的代码也会出错。例如,析构函数中存在内存泄漏
Stack::~Stack() {
linklst * r = new linklst();
while (true)
{
r = top;
top = top->next;
delete r;
}
delete top;
};
首先,您分配新的linklst并将其分配给r但是然后在循环中重新分配r。 您的堆栈设计中还有其他错误
例如,不需要在构造函数中分配“虚拟”顶部。我将按以下方式定义构造函数
Stack::Stack()
{
top = NULL; // or nullptr
}
Amd成员函数isempty看起来像
bool Stack::isempty()
{
return ( top == nullptr);
}
成员函数pop也有未定义的行为,因为它在堆栈为空时不返回任何内容
int Stack::pop(){
if (!isempty){
linklst * r = top;
top = top->next;
int x = r->num;
delete r;
return x;
}
};
答案 1 :(得分:1)
简而言之,无论堆栈需求如何,您的链接列表接口/数据结构都会稍微关闭。
更确切地说,它所说的问题是最大的问题:您的类定义没有为您提供将linklist
插入linklist
的方法,但这就是您正在做的事情,而且我可以补充一点。
在代码行top = top->next;
中您试图将r
,指向linklist *
的指针分配给next
,指向int的指针。如上所述,意图是正确的,定义是错误的。 next
应该是指向linklist
的指针。
struct linklst {
int num; // current payload
linklst* next; // pointer to the next linklst, NULL for EOL. (Not an int*)
};
已更新
有关代码中的更多信息和其他问题,请查看Vlad的回答