C++堆栈数据结构。这段代码怎么了? P>所以我现在尝试通过实现各种数据结构来将java经验迁移到C++中,以便至少实现一次。

C++堆栈数据结构。这段代码怎么了? P>所以我现在尝试通过实现各种数据结构来将java经验迁移到C++中,以便至少实现一次。,c++,data-structures,stack,C++,Data Structures,Stack,你介意给我一些建议吗?我遇到的问题主要集中在pushint值中的指针,尤其是pop。由于push似乎工作正常,我发现自己在弹出东西时很难获得正确的值。怎么了 PS:我还认为,既然我手动分配了阵列空间,我也需要删除它。我该怎么做 #ifndef STACK_H #define STACK_H class Stack { private: int *stackArray; int elementsInArray; int allocatedArraySize; in

你介意给我一些建议吗?我遇到的问题主要集中在pushint值中的指针,尤其是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;
}

<>我确信你已经知道你有一个普通的C++栈,它在STD库中称为模板。假设您是以代码kata的形式来做这件事,我会开始以模板的形式来编写它,这样它就不能接受除整数以外的对象类型


此外,如果你要把更多的低级结构作为你的KATA的一部分,那么写一个C++类,你可以委派所有的分配、重新分配和分配的大小跟踪,并且使用它而不是直接使用数组。假设您是以代码kata的形式来做这件事,我会开始以模板的形式来编写它,这样它就不能接受除整数以外的对象类型


此外,如果您打算在kata中编写更多此类低级结构,请编写一个精简类,在该类中您可以委托所有分配、重新分配和分配大小跟踪,并使用该类,而不是直接使用数组。

对于初学者,您应该在数组上增加索引,因此更改:

elementsInArray++;
stackArray[elementsInArray] = aValue;
致:

或:

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

int temporaryArray[allocatedArraySize*beta];
致:

第三,在复制tempArray的位置之前保存stackArray中的原始指针,然后在复制指针后执行删除操作,从而添加刚才提到的删除操作


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

对于初学者,您应该对数组上的索引进行后期递增,因此更改:

elementsInArray++;
stackArray[elementsInArray] = aValue;
致:

或:

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

int temporaryArray[allocatedArraySize*beta];
致:

第三,在复制tempArray的位置之前保存stackArray中的原始指针,然后在复制指针后执行删除操作,从而添加刚才提到的删除操作


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

您使用的是堆栈上的数组,而不是堆栈-程序执行堆栈。在你的推送函数中,它被称为临时数组。当您从该函数返回时,该数组的地址将无效,因为其他函数将使用堆栈保存其他数据

您要做的是在堆上分配该数组。这是一个内存,只要你需要它,它就会一直存在于你的程序中。要做到这一点,您可以像下面这样分配临时数组

int * temporaryArray(new int[allocatedArraySize*beta]);
然后,从旧数组复制元素后,您可以使用以下方法将其删除:

delete [] stackArray;
在使用临时数组分配stackArray之前执行此操作


您的数据结构可能存在其他问题,但是您正确地进行了基本索引,并适当地增加/减少了当前索引,尽管我建议您在不使用临时索引时,最好使用预增加/减少形式,作为进入-即++元素数组/-元素数组的好习惯。

您使用的是堆栈上的数组,而不是堆栈上的数组-程序执行堆栈。在你的推送函数中,它被称为临时数组。当您从该函数返回时,该数组的地址将无效,因为其他函数将使用堆栈保存其他数据

您要做的是在堆上分配该数组。这是一个内存,只要你需要它,它就会一直存在于你的程序中。要做到这一点,您可以像下面这样分配临时数组

int * temporaryArray(new int[allocatedArraySize*beta]);
然后,从旧数组复制元素后,您可以使用以下方法将其删除:

delete [] stackArray;
在使用临时数组分配stackArray之前执行此操作


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

抱歉,您做得完全错误,推送和弹出都不能正常工作。最大的问题是你不理解内存分配

C++中有点奇怪,因为如果你用java方式做了,你会更接近。您不能在临时数组[allocatedArraySize*beta]中执行此操作。。。stackArray=temporaryArray;。它可以编译,但肯定不起作用。内存分配是一个太大的话题,在这样的论坛上是无法涵盖的。您需要阅读一本关于C++的书。抱歉,但是您做的都是错误的,而且Press和POP都不正确工作。最大的问题是你不理解C++中的内存分配,这有点奇怪,因为如果你用java方式完成它,你会更接近。您不能在临时数组[allocatedArraySize*beta]中执行此操作。。。stackArray=temporaryArray;。它可以编译,但肯定不起作用。内存分配是一个太大的话题,在这样的论坛上是无法涵盖的。你需要阅读一本关于C++的书。这个答案真的没抓住要点。发布的代码有严重错误。代码Kata正是我想要做的。措辞巧妙:-将在这段代码上工作一段时间,并在稍后迁移到模板时尝试遵循您的建议。实际上,这个答案没有抓住要点。发布的代码有严重错误。代码Kata正是我想要做的。措辞巧妙:-将继续处理这段代码,并在稍后迁移到模板时尝试遵循您的建议。OP还需要向堆栈类添加析构函数、复制构造函数和赋值运算符。只有这样他们才会有工作代码。非常感谢格雷格,非常感谢!你和ex0du5帮了我很多忙。约翰,我知道在cpp方面我还有很多东西要学,但我不是编程方面的处女,在你在三篇评论中宣布我的尝试基本上没有希望的时候,另外三篇评论帮了我很多。尽管如此,还是谢谢你。我想我被赋予了为你解决代码kata的使命;下次我只会给你一些提示@芥末:即使你不喜欢约翰说话的方式,也要注意他说的话。他提到的函数被称为你的类违反的三元规则,如果你不修复它,将会导致重大问题。+1@Mooin Duck。-旁注:我确实注意到了,我已经在阅读了:-这就是为什么我感谢他。OP还需要在堆栈类中添加析构函数、复制构造函数和赋值运算符。只有这样他们才会有工作代码。非常感谢格雷格,非常感谢!你和ex0du5帮了我很多忙。约翰,我知道在cpp方面我还有很多东西要学,但我不是编程方面的处女,在你在三篇评论中宣布我的尝试基本上没有希望的时候,另外三篇评论帮了我很多。尽管如此,还是谢谢你。我想我被赋予了为你解决代码kata的使命;下次我只会给你一些提示@芥末:即使你不喜欢约翰说话的方式,也要注意他说的话。他提到的函数被称为你的类违反的三元规则,如果你不修复它,将会导致重大问题。+1@Mooin Duck。-旁注:我确实注意到了,而且我已经在阅读他们了:-这就是为什么我感谢他。非常感谢:也帮了我很多。非常感谢:也帮了我很多。