【问题标题】:Implementing a stack class in C++在 C++ 中实现堆栈类
【发布时间】:2014-02-20 16:48:33
【问题描述】:

我正在尝试使用链表实现一个堆栈类,这是我的 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);

};

每当我尝试将 top 分配给 r 时,我的问题就在 cpp 文件中,例如在 push 函数中 r->next = top; 我收到此错误“无法将 stack::linllst * 类型的值分配给 int * 类型的实体”

有谁知道我做错了什么??

任何帮助将不胜感激 谢谢

【问题讨论】:

  • 不应该 int* next;linklst* next; 吗?链表中的节点应该指向下一个节点,而不是下一个节点包含的数据。

标签: c++ pointers linked-list stack


【解决方案1】:

更改结构定义
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;

    }

};

【讨论】:

  • 这除了我们常见的答案还有很多其他的优点
  • @UpAndAdam 我使用 PL/X 的面向对象特性为 IBM NFS 服务器编写了 CTRACE 记录过滤。是NFS Server代码中最好的代码。:)
【解决方案2】:

简而言之,无论堆栈需求如何,您的链表接口/数据结构都略有偏差。

更准确地说,问题是最大的问题:您的类定义没有为您提供将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 的答案

【讨论】:

  • 我将 top 定义为指向链表的指针,如您在头文件中所见。我看不到我在哪里将它定义为 int 指针
  • 是的,我打错了,top 应该说next
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 2020-09-13
相关资源
最近更新 更多