基于数组的堆栈实现

时间:2016-09-28 08:03:41

标签: c++ arrays stack

这是我的代码,但是有一个我无法理解的问题:每当我在堆栈中推送一个整数时,剩余的(未填充的部分)堆栈都被sed: 3: "10i\ #define jsonConfi ...": invalid command code T 值填充。请解释一下我的错误是什么。

invalid command code T

2 个答案:

答案 0 :(得分:1)

考虑:

Stack s(10);
for(int i = 0; i<=5; i++)
    s.push(i);
你在print中的

std::cout << "Stack is ";
while(i <= max_size)
    std::cout << base[i] << ' ';

在上面的例子中,s.max_size是10,所以你打算打印base [0,10)的值,其中5个是未初始化的。因为应用程序还没有对内存做太多工作,所以当你执行分配时,你可能会得到一个原始(零)内存块。

代码的可能变体:

#include <iostream>
// using namespace std ;  // unlearn the habbit of doing this.
#include <memory>  // for unique_ptr

class Stack
{
    // note: class is private by default.
        // unique_ptr will automatically free memory for us.
        using  ptr_t = std::unique_ptr<int[]>;

        ptr_t  base_;
        int*   top_;
        int*   end_;

    public :
        Stack(int size=100)
          : base_(new int[size])
          , top_(base_.get())
          , end_(top_ + size)
        {}

        bool empty() const
        { return top_ == base_.get(); }

        bool full() const
        { return top_ == end_; }

        // don't print errors from a library
        bool push(int value)
        { 
            if (full())  // written in terms of our own members
                return false;
            *(top_++) = value;
            return true; 
        }

        bool pop()
        { 
            if (empty())  // written in terms of our own members
                return false;
            --top_;
            return true;
        }

        const int& read_top() const  // const ref so it's not modifiable
        { return *(top_-1); }

        int size() const { return end_ - top_; }
        int capacity() const { return end_ - base_.get(); }

        std::ostream& print(std::ostream& to)
        {
            to << "Stack is ";
            for (int* ptr = base_.get(); ptr != top_; ++ptr)
                to << *ptr << ' ';
            to << '\n';
            return to;
        }

        // or we could do this:
        friend std::ostream& operator << (std::ostream& to, const Stack& s)
        {
            to << '[';
            for (int* ptr = s.base_.get(); ptr != s.top_; ++ptr) {
                to << *ptr << ',';
            }
            return to << ']';
        }
};

int main()
{
    Stack s(5);
    s.push(1);
    s.push(2);
    s.push(3);
    s.print(std::cout);
    std::cout << "stack is: " << s << '\n';
}

现场演示:http://ideone.com/JsA4EU

答案 1 :(得分:-2)

我不确定我的问题是否正确:你是什么意思&#34;每次我在我的堆栈中推送一个整数&#34;?据我所知,你初始化你的堆栈然后做一些推动,而不更改其间的不正确的数组。这里发生的是你的数组被初始化为0(不要指望你的编译器每次都这样做,但这次它确实 - 你很可能在没有优化的情况下进行编译),然后你添加单个元素,并且有人已经回答,你不打印你的堆栈(即从0到顶部),但整个不正确的数组。如果编译优化,您可能会获得垃圾值而不是零(数组未初始化为构造函数中的某些初始值,未分配的值可能包含任何值)。希望它有所帮助。

代码中的错误:在print()方法中,您应该while(i < max_size)