【问题标题】:Stack implementation C++堆栈实现 C++
【发布时间】:2014-03-09 14:11:40
【问题描述】:

我已经使用下一个类实现了一个堆栈:

template <typename T, int lungime> class Depou
{
    private:

        T *depouarray;
        int top;

    public:

        Depou ()
        {
            this -> top = -1;
            depouarray = (T *) calloc (lungime, sizeof (T));

        }

        ~Depou ()
        {
            free (depouarray);
        }

        void push (T x)
        {
            if (top >= lungime - 1)
            {
                return;
            }

            top ++;
            depouarray [top] = x;   
        }

        T pop ()
        {
            if (isEmpty ())
            {
                return -1;
            }
            T x;
            x = depouarray [top];
            top --;
            return x;   
        }

        T peek ()
        {
            if (isEmpty ())
            {
                return -1;
            }
            return depouarray[top];
        }

        int isEmpty ()
        {
            return (top < 0);
        }
}

我的问题是下一个: 在我将一个元素添加到堆栈后,比如说 3,我验证它并显示 3。 接下来,我添加了另一个元素,比如说 4,我验证了堆栈的内容,它显示了一个非常高的数字(这肯定是垃圾)和 4。我不明白为什么它将第一个元素转换为垃圾,只留下最后一个按原样添加元素。

【问题讨论】:

  • 这是 C++。为什么要手动分配内存?
  • std::stack 不适合你?
  • 为什么在 C++ 中使用 callocfree
  • 我要实现自己的栈,容量有限,必须动态分配。
  • 我刚试了你的课,在推了 3 和 4 之后没有在堆栈中得到任何垃圾。请提供更多详细信息。

标签: c++ stack


【解决方案1】:

正如我的同事所指出的,您的代码中有很多错误,我认为纠正这些错误需要付出太多努力。因此,我给你一个堆栈实现。

堆栈是一个 FILO 结构。实现它的最佳方法是使用 Node 并将它们链接在一起。看看下面的代码,它是直截了当的。如果您有任何问题,请告诉我。

template <class T>
class Stack {
public:
    Stack();
    ~Stack();
    void push(const T&);
    void pop(T& out);
    T pop();
    bool is_empty() const;
    void clear();
private:
    class Node {
    public:
        Node(const T& t, Node* c);
        T contain;
        Node* next;
    };
    Node* peak;

};

template <class T>
Stack<T>::Stack()
{
    peak = NULL;
}

template <class T>
Stack<T>::~Stack()
{
    clear();
}

template <class T>
bool Stack<T>::is_empty() const
{
    return peak == NULL;
}

template <class T>
void Stack<T>::clear()
{
    while(!is_empty())
        pop();
}

template <class T>
Stack<T>::Node::Node(const T& t, Node* c) : next(c)
{
    contain = t;
}

template <class T>
void Stack<T>::push(const T& t)
{
    peak = new Node(t, peak);
    assert(peak);
}

template <class T>
T Stack<T>::pop()
{
    assert(peak);
    Node c(*peak);
    delete peak;
    peak = c.next;
    return c.contain;
}

template <class T>
void Stack<T>::pop(T& t)
{
    assert(peak != NULL);
    t = peak->contain;
    Node* c = peak;
    peak = peak->next;
    delete c;
}

【讨论】:

  • 感谢您的快速回复。我确实有一个问题。 pop 和 push 函数中的 assert(peak) 是什么意思?
  • assert(peak) 和 assert(peak != NULL) 是一回事,实际上最后一种形式更好,因为它明确表示 peak 是一个指针。它用作后置条件。它说在推入一个元素后,peak 不应该为 null。pop 也会发生同样的事情。它在删除元素之前验证 peak 是一个有效的指针。您应该使用 assert 来防止程序员的未定义行为。这样,当堆栈中没有元素时,您(程序员)就不能使用 pop。
  • 我明白了。感谢您的回复。
  • 不客气。如果您认为问题解决了,您可以为我的答案投票。
  • 如何在函数 pop() 中删除一个节点,然后引用同一个节点?似乎您首先使 c 指向同一位置的峰值点,然后删除峰值,然后尝试访问它...
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2020-09-13
  • 2011-12-04
相关资源
最近更新 更多