C ++堆栈数据结构。这段代码有什么问题?

时间:2011-08-22 21:11:21

标签: c++ data-structures stack

因此,我正在尝试通过实现各种数据结构将我的Java体验迁移到C ++,以便至少实现一次。

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

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;
}

3 个答案:

答案 0 :(得分:5)

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

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保存原始指针来添加你正在讨论的删除,然后在完成指针复制后执行删除。

最后,您必须对弹出功能进行类似的更改......

答案 1 :(得分:1)

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

您要做的是在上分配该数组。只要您需要,这就是您的程序所在的内存。为此,您将分配您的temporaryArray,如

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

然后,在复制旧数组中的元素后,您将使用以下命令删除它:

delete [] stackArray;

在使用temporaryArray分配stackArray之前执行此操作。

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

答案 2 :(得分:0)

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

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