C++堆栈数据结构。这段代码怎么了? P>所以我现在尝试通过实现各种数据结构来将java经验迁移到C++中,以便至少实现一次。
你介意给我一些建议吗?我遇到的问题主要集中在pushint值中的指针,尤其是pop。由于push似乎工作正常,我发现自己在弹出东西时很难获得正确的值。怎么了 PS:我还认为,既然我手动分配了阵列空间,我也需要删除它。我该怎么做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
#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。-旁注:我确实注意到了,而且我已经在阅读他们了:-这就是为什么我感谢他。非常感谢:也帮了我很多。非常感谢:也帮了我很多。