我的ArrayStack在这里发生了什么?

时间:2015-10-16 02:43:53

标签: c++ stack

所以我一直在尝试实现一个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;
        }

   }
}

2 个答案:

答案 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;

了解示例herehere

的区别

答案 1 :(得分:0)

你真的应该仔细检查这段代码,看看它在做什么。我不确定你将如何成功地完成100次迭代。

  1. 在递增/递减时需要更加注意。有时您在设置项目之前递增,有时在设置项目后递增。

  2. 您正在推送引用而不是指针(并且您的arrayStack应该是指针列表)。

  3. 当您遇到溢出情况时,您应该将尺寸加倍,以确保您不必在每次推送时重新创建阵列。

  4. 您有大量内存泄漏,因为在增加arrayStack大小时永远不会删除它。

  5. 您正在分配一个局部变量,并且不执行任何操作。