【问题标题】:C++ Stack datastructure. What's wrong with this piece of code?C++ 堆栈数据结构。这段代码有什么问题?
【发布时间】:2011-08-22 21:11:21
【问题描述】:

所以我目前正在尝试通过实现各种数据结构来将我的 Java 经验迁移到 C++,以便让它们至少实现一次。

你介意给我一些建议吗?我遇到的问题主要集中在 push(int value) 中的指针,尤其是 pop() 中。由于 push 似乎工作正常,我发现自己在弹出东西时很难恢复正确的值。怎么了?

PS:我也认为,由于我手动分配我的数组空间,我也需要删除它。我该怎么做?

#ifndef STACK_H
#define STACK_H

class Stack
{
private:
    int *stackArray;
    int elementsInArray;
    int allocatedArraySize;
    int alpha;
    int beta;

public:
    Stack();
    void push(int aValue);
    int pop();
    bool isEmpty();
    int size() const;
};

#endif

和实施:

#include <iostream>
#include "Stack.h"

Stack::Stack() 
{
    alpha = 4;
    beta = 2;
    elementsInArray = 0;
    allocatedArraySize = 1;
    stackArray = new int[1];
}

void Stack::push(int aValue)
{
    if (elementsInArray == allocatedArraySize) 
    {
        int temporaryArray[allocatedArraySize*beta];

        for (int i = 0; i < elementsInArray; i++)
            temporaryArray[i] = stackArray[i];

        stackArray = temporaryArray;
        allocatedArraySize *= beta;
    }

    elementsInArray++;
    stackArray[elementsInArray] = aValue;
}

int Stack::pop()
{
    int result = -INT_MAX;

    if (elementsInArray == 0)
        return result;

    if (elementsInArray > 0) 
    {
        result = stackArray[elementsInArray-1];
        elementsInArray--;

        if (elementsInArray <= allocatedArraySize/alpha) 
        {
            int temporaryArray[allocatedArraySize/alpha];

            for (int i = 0; i < elementsInArray; i++) 
                temporaryArray[i] = stackArray[i];

            stackArray = temporaryArray;
            allocatedArraySize /= beta;
        }
    }

    return result;
}

bool Stack::isEmpty()
{
    if (elementsInArray == 0) 
        return true;

    return false;
}

int Stack::size() const
{
    return allocatedArraySize;
}

【问题讨论】:

  • 对不起,你做错了,push 和 pop 都不能正常工作。最大的问题是您不了解 C++ 中的内存分配(这有点奇怪,因为如果您以类似 Java 的方式完成它,您会更接近)。你不能这样做int temporaryArray[allocatedArraySize*beta]; ... stackArray = temporaryArray;。它会编译,但它肯定不会工作。内存分配是一个太大的话题,无法在这样的论坛中讨论。您迫切需要阅读一本关于 C++ 的书。

标签: c++ data-structures stack


【解决方案1】:

对于初学者,你应该在数组中增加索引,所以改变:

elementsInArray++;
stackArray[elementsInArray] = aValue;

到:

stackArray[elementsInArray++] = aValue;

或:

stackArray[elementsInArray] = aValue;
elementsInArray++;

其次,当您创建新的临时数组时,您是在 if 语句中执行它...因此它是一个局部变量并放置在系统堆栈中,并在您退出 if 语句后丢失。所以改变

int temporaryArray[allocatedArraySize*beta];

到:

int *temporaryArray = new int[allocatedArraySize*beta];

第三,通过在复制 tempArray 的位置之前从 stackArray 中保存原始指针来添加您所说的删除,然后在复制指针后执行删除。

最后,您必须对 pop 函数进行类似的更改...

【讨论】:

  • 并且OP还需要在Stack类中添加析构函数、复制构造函数和赋值运算符。只有这样他们才有工作代码。
  • 非常感谢格雷格,非常感谢!你和 ex0du5 帮了我很多忙。约翰,我知道在 cpp 方面我还有很多东西要学,但我在编程方面不是处女,当你宣布我的尝试在三个独立的 cmets 中基本上没有希望时,其他三个设法帮助了我更多.不过还是谢谢你。
  • 我想我已经被配音为你解决你的代码卡塔! ;) 下次我只是给出提示!
  • @wasabii:即使你不喜欢约翰的说话方式,也要注意他说的什么。他提到的功能被称为你的班级违反的“三原则”,如果你不修复它会导致大问题。
  • +1 @ Mooin Duck。 - 旁注:我确实注意到了,我已经在阅读它们了 :-) 这就是为什么我仍然感谢他。
【解决方案2】:

您正在堆栈上使用一个数组(不是您的堆栈 - 程序执行堆栈)。它是您的推送函数中称为temporaryArray 的那个。当您从该函数返回时,该数组的地址将无效(因为其他函数将使用堆栈来保存其他数据)。

您要做的是在 上分配该数组。只要您需要,它就会为您的程序保留下来。为此,您将分配您的临时数组,如

int * temporaryArray(new int[allocatedArraySize*beta]);

然后,从旧数组中复制元素后,您可以使用以下命令将其删除:

delete [] stackArray;

在将 stackArray 分配给temporaryArray 之前执行此操作。

您的数据结构可能存在其他问题,但您正确地进行了基本索引并适当地递增/递减当前索引(尽管我建议在不使用临时索引时更喜欢使用预递增/递减形式)进入的习惯 - 即 ++elementsInArray / --elementsInArray)。

【讨论】:

  • 非常感谢 :) 也帮了我很多忙。
【解决方案3】:

好吧,我确定您已经知道您在 STD 库中将堆栈作为通用(c++ 称之为模板)。假设您将其作为代码 kata 执行,我将开始将其编写为模板,因此它不能采用整数以外的对象类型。

另外,如果您要编写更多这些低级结构(作为 kata 的一部分),请编写一个瘦类,在其中委托所有分配、重新分配和分配的大小跟踪,并使用它而不是直接使用数组.

【讨论】:

  • 这个答案真的没有抓住重点。贴出的代码有严重错误。
  • “Code-Kata”正是我想要做的。措辞很好:-)
  • 将在这段代码上工作一段时间,并在稍后迁移到模板时尝试遵循您的建议。
猜你喜欢
  • 1970-01-01
  • 2013-11-14
  • 2017-10-07
  • 2023-03-22
  • 2016-10-23
  • 2013-04-30
  • 2015-04-25
  • 2018-09-09
相关资源
最近更新 更多