理解堆栈数据结构并实现它

时间:2013-02-07 15:41:07

标签: c++ stack

请查看以下代码

template <typename T>

class Stack
{
public:
    Stack(int number)
    {
        maxSize = number;
        top = -1;
        stackData = new T*(maxSize);
    }

    ~Stack()
    {
        delete [] stackData;
    }

    int count()
    {

    }

    bool isEmpty()
    {
        if(top==-1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    bool isFull()
    {
        if(top== (maxSize-1))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    *T pop()
    {
        if(!isEmpty())
        {
            return stackData[top--]; // Remove Item From Stack
        }
    }

    *T peek();

    void push(T *pushValue)
    {
        if(!isFull())
        {
            stackData[++top] = pushValue;
        }
    }

private:
    int maxSize;
    T ** stackData;
    int top;
};

在上面的代码中,注释行显示“从堆栈中删除项目”。但实际上,它并没有消除,它只是提供了一个价值落后的价值,对吗?在这里,我将删除称为完全破坏堆栈中的特定值。

ex:在包含数据1,2,3,4的数组中,我删除了'2'。所以现在是1,3,4

其次,“peek()”方法中应该发生什么?

第三,我有没有发现任何错误?

请帮忙!

5 个答案:

答案 0 :(得分:2)

他们使用数组作为堆栈。实际上,顶部指向堆栈中的顶部元素。所以当你这样做时:

return stackData[top--]; 

顶部减少,因此堆栈的大小减少。你真的弹出一个元素。

peek应该返回堆栈顶部的当前元素 - 弄清楚如何为自己做这件事。

答案 1 :(得分:2)

从概念上讲,递减top和&#34;删除&#34;之间没有区别。顶级项目。单词&#34;删除&#34;是一个概念抽象来描述堆栈中的顶部项不再是堆栈中的元素的想法。事实上,它并没有在内存中从字面上删除它是无关紧要的。

如果你的意思是你想要&#34;销毁&#34;顶级项目,即调用它的析构函数并释放它,你需要考虑你的Stack类如何管理内存的更大含义。如果堆栈应该取得每个T对象的所有权,并且已使用T分配了每个new对象,那么您可以拥有pop()函数{{1}递减delete之前的顶级项目。 (但是top无法返回指向已删除元素的指针。)如果堆栈没有取得每个项目的所有权,那么由调用者决定pop()来管理元素的生命周期/释放。

接下来,pop()方法只返回指向顶部项目的指针,而不将其从堆栈中删除。

最后,您没有正确分配peek()指针数组。语法应为:

T*

您发布的代码在stackData = new T*[maxSize]; 之后使用括号而不是括号,这不是您想要的。

答案 2 :(得分:0)

1)pop会弹出一个元素,但它会保留在数组中,直到某些元素被推到它上面。但是你已经改变top所以堆栈不再“知道”它已经存在了。如果是复杂类型,则不会在pop上调用析构函数。

2)peek通常显示堆栈的顶部而不会弹出它。

3)你没有验证构造函数的number参数。

此外,您可以将isFUll()简称为{ return (top== (maxSize-1));}

答案 3 :(得分:0)

您确定引用正确:

stackData = new T*(maxSize);

不应该是:

stackData = new T*[maxSize];

你是对的,pop方法不会“破坏”数据,它只是将堆栈的顶部移动到下一个位置(从顶部元素到顶部的第二个元素)。我不确定你为什么要“摧毁堆栈中的特定价值”......总的来说,这不会有任何有意义的目的。

此外,你所描述的“删除中间的东西”并不是你通常用堆栈做的事情 - 这是一个列表,deque或类似的东西。

关于编写一个peek函数,它将涉及与pop几乎相同的步骤,除非你不移动top ......

答案 4 :(得分:0)

这个想法是索引大于top的每个元素都是无效的,而索引小于top的任何元素都是有效的。通过减少顶部,您将删除一个元素,通过增加顶部,您将添加一个元素。