2015-10-16 94 views
-3

所以我一直在试图实现一个arrayStack,但我似乎有弹出超过100个元素的问题。我的程序在达到100个时会停止工作。这似乎是推动和流行的问题,但不太明白我的问题是什么。这里我的ArrayStack发生了什么?

#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

你可以显示你从运行你的代码得到的实际错误消息吗? –

+0

它结束之前,即使它说数组增长为1. http://imgur.com/rf6GQ6p – dikshant

+2

当人们为您修复代码时,您需要停止编辑您的问题。答案不再有意义,因为问题已经改变。 – John3136

回答

2

可能的一切,你应该做的是在你的Pop功能改变arrayStack[index]==0index == 0。否则,你有冒险访问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

+0

似乎不是它。 – dikshant

+1

好吧,然后看看@ John3136答案。尽管如此,我指出的还有代码的问题。 – Rostislav

+0

为了完全解决这个问题,你需要提供调用'ArrayStack_1'的代码以及'DEFAULT_SIZE'的定义。 – Rostislav

0

您的原因lly应该通过这段代码来看看它在做什么。我不确定你将如何成功完成100次迭代。

  1. 当你递增/递减时,你需要更加注意。有时你在设置项目之前递增,而在设置项目之后,其他时间递增。

  2. 你正在推送一个引用而不是一个指针(你的arrayStack应该是一个指针列表)。

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

  4. 由于在增加尺寸时从不删除arrayStack,因此存在大量内存泄漏。

  5. 您正在分配一个局部变量并且什么也不做。

相关问题