所以我一直在尝试实现一个arrayStack但是我似乎遇到了超过100个元素的问题。当程序达到数百时,我的程序才停止工作。似乎推送和弹出有问题,但不太明白我的问题是什么。
#ifndef _ARRAYSTACK_1_HPP_
#define _ARRAYSTACK_1_HPP_
#include <stddef.h>
#include "StackADT.h"
#define DEFAULT_SIZE 50
template<class T>
class ArrayStack_1 : public StackADT<T> {
private:
T *arrayStack;
int index;
int maxSize;
public:
// a constructor for the arrayStack that creates and arrayStack of a given size
ArrayStack_1(int size = DEFAULT_SIZE) {
maxSize = size;
index = 0;
arrayStack = new T[size];
}
public:
// a constructor for the arrayStack that creates and arrayStack of a given size
ArrayStack_1(int size = DEFAULT_SIZE) {
maxSize = size;
index = 0;
arrayStack = new T[size];
}
//a destructor that deletes the arrayStack
~ArrayStack_1() {
delete[] arrayStack;
}
bool Empty() {
return index==0;
}
void Push(T& item = 0) {
if (index<maxSize) {
arrayStack[index]= item;
index+=1;
}else {
T* tempArrayStack = arrayStack; //making a copy of the array stack
maxSize+=1;
arrayStack = new T[maxSize];
for (int i=0; i<maxSize; i++){
arrayStack[i]=tempArrayStack[i];
}
arrayStack[index]=item;
index+=1;
delete[] tempArrayStack;
}
}
T Pop() {
if(arrayStack[index]==0){
return 0;
}else {
T element = arrayStack[index];
index--;
return element;
}
}
}
答案 0 :(得分:2)
您应该做的就是在arrayStack[index]==0
函数中将index == 0
更改为Pop
。否则,您可能会冒险使用负索引访问arrayStack
,这是未定义的行为(可能是导致崩溃的原因)。
此外,在重新分配堆栈时,应在重新分配之前增加堆栈大小。即交换这些行:
T* arrayStack = new T[maxSize];
maxSize+=1;
此外,您没有将arrayStack
的新值分配给您的成员变量 - 您在此代码中定义了一个新的局部变量。总的来说,这些行应该是:
this->arrayStack = new T[++maxSize];
(注意,你不必写this->arrayStack
,简单的arrayStack = ...
就可以完成这项工作 - 只是为了明确意图,它就在那里
并且不要忘记delete tempArrayStack
,否则你会泄漏记忆。
修改强> 这些行也应该交换:
index+=1;
arrayStack[index]=item;
再次,你可以使用++
- 在这种情况下是后缀版本:
arrayStack[index++] = item;
的区别
答案 1 :(得分:0)
你真的应该仔细检查这段代码,看看它在做什么。我不确定你将如何成功地完成100次迭代。
在递增/递减时需要更加注意。有时您在设置项目之前递增,有时在设置项目后递增。
您正在推送引用而不是指针(并且您的arrayStack应该是指针列表)。
当您遇到溢出情况时,您应该将尺寸加倍,以确保您不必在每次推送时重新创建阵列。
您有大量内存泄漏,因为在增加arrayStack大小时永远不会删除它。
您正在分配一个局部变量,并且不执行任何操作。