因此,我正在尝试通过实现各种数据结构将我的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;
}
答案 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的一部分),请编写一个瘦类,在其中委派所有分配,重新分配和分配大小跟踪,并使用它而不是直接使用数组