【问题标题】:Understanding Stack Data Structure and Implementing it理解堆栈数据结构并实现它
【发布时间】:2013-01-23 04:27:35
【问题描述】:

请看下面的代码

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()”方法内部应该发生什么?

三、有没有我没发现的错误?

请帮忙!

【问题讨论】:

    标签: c++ stack


    【解决方案1】:

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

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

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

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

    stackData = new T*[maxSize];
    

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

    【讨论】:

    • 太棒了。谢谢你的帮助:)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你确定引用正确吗:

      stackData = new T*(maxSize);
      

      不应该是:

      stackData = new T*[maxSize];
      

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

      此外,您所说的“删除中间的东西”并不是您通常对堆栈执行的操作 - 这是一个列表、双端队列或类似的东西。

      至于编写 peek 函数,它与pop 的步骤几乎相同,只是你不要移动top...

      【讨论】:

        【解决方案4】:

        1) pop 确实会弹出一个元素,但它会保留在数组中,直到有东西被推到它上面。但是您已经更改了top,因此堆栈不再“知道”它的存在。如果是复杂类型,则不会在pop 上调用析构函数。

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

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

        另外,您可以将isFUll() 写成简单的{ return (top== (maxSize-1));}

        【讨论】:

          【解决方案5】:

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

          return stackData[top--]; 
          

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

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

          【讨论】:

            猜你喜欢
            • 2018-06-02
            • 1970-01-01
            • 1970-01-01
            • 2016-08-13
            • 2015-11-15
            • 2015-10-21
            • 2020-03-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多