2015-10-16 127 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. 您正在分配一個局部變量並且什麼也不做。

相關問題