0

请看下面的代码

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;
};

在上面的代码中,注释行说“从堆栈中删除项目”。但实际上,它不是删除,它只是提供一个值,它是一个值,对吧?在这里,我将删除称为从堆栈中完全破坏该特定值。

例如:在包含数据 1、2、3、4 的数组中,我删除了“2”。所以现在是 1,3,4

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

第三,有没有我没有发现的错误?

请帮忙!

4

5 回答 5

2

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

return stackData[top--]; 

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

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

于 2013-02-07T15:44:22.370 回答
2

top从概念上讲,递减和“删除”顶部项目之间没有区别。“移除”一词是一个概念抽象,用于描述堆栈中的顶部项目不再是堆栈中的元素的想法。它并没有从内存中的那个位置逐字删除这一事实是无关紧要的。

如果你的意思是你想“销毁”顶层项目,即调用它的析构函数并释放它,你需要考虑你的Stack类如何管理内存的更大影响。如果堆栈应该拥有每个T对象的所有权,并且每个T对象都已使用 分配new,那么您可以在递减之前让您的pop()函数delete成为顶部项目top。(但pop()不能返回指向已删除元素的指针。)如果堆栈拥有每个项目的所有权,则由调用者pop()来管理元素的生命周期/解除分配。

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

最后,您没有正确分配T*指针数组。语法应该是:

stackData = new T*[maxSize];

您发布的代码在后面使用括号new而不是括号,这不是您想要的。

于 2013-02-07T15:47:08.560 回答
0

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

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

3)您不验证number构造函数的参数。

isFUll()此外,您可以简单地编写{ return (top== (maxSize-1));}.

于 2013-02-07T15:47:43.480 回答
0

你确定这是正确引用:

stackData = new T*(maxSize);

不应该是:

stackData = new T*[maxSize];

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

此外,您所描述的“删除中间的东西”并不是您通常对堆栈所做的事情 - 这是一个列表、双端队列或类似的东西。

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

于 2013-02-07T15:47:52.630 回答
0

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

于 2013-02-07T15:48:00.473 回答