在C ++中实现堆栈类

时间:2014-02-20 16:48:34

标签: c++ pointers linked-list stack

我正在尝试使用链表实现堆栈类,这是我的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 *类型的实体”

有谁知道我做错了什么?

任何帮助将不胜感激 感谢

2 个答案:

答案 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的回答