【问题标题】:Stack (Data structure) implementation堆栈(数据结构)实现
【发布时间】:2018-06-02 13:28:25
【问题描述】:

所以我刚刚开始通过 Coursera 上的课程学习数据结构,并且我了解到可以通过使用数组来创建堆栈数据结构。我只是想知道我所写的是否是堆栈应该做的。

#include <iostream>
using namespace std;

const int MAX_SIZE = 10000;

class Stack {
    public:
        Stack();
        ~Stack();
        void push(int n);
        void pop();
        int top();
        bool isEmpty() const;
        void print() const;
    private:
        int* array [MAX_SIZE];
        int curNum;
};

Stack::Stack() {
    curNum = 0;
}

Stack::~Stack() {
    for (int i = 0; i < curNum; ++i) 
        delete array[i];
}

void Stack::push(int n) {
    if (curNum >= MAX_SIZE) {
        cout << "reached maximum capacity...can't add an element\n";
        return;
    }
    array[curNum] = new int(n);
    curNum++;
}

void Stack::pop() {
    delete array[curNum];
    curNum--;
}

int Stack::top() {
    return *array[curNum];
}

void Stack::print() const{
    for (int i = 0; i < curNum; ++i) 
        cout << *array[i] << endl;
}

bool Stack::isEmpty() const{
    return curNum == 0;
}

int main () {
    Stack stack;
    stack.push(5);
    stack.print();
    stack.pop();
}

另外,我看到很多人不使用动态内存分配来完成此类任务。有什么原因吗?似乎在编译时为数组指定大小可能会导致内存不足或过度分配内存给我

【问题讨论】:

  • 编写一个测试应用程序,将事物推入堆栈,然后将它们弹出。它工作正常吗?我们不是代码测试人员。
  • 有趣的是,您提到内存不足或过度分配内存,考虑到 10000 个 int 指针的数组在堆栈上可能有 80 KB 加上 40 KB + 动态分配开销(如果全部使用),而数组10000 个整数在堆栈上可能有 40 KB,仅此而已。
  • 如果类足够大,可能值得动态分配它的对象,但这种情况不会经常出现。也可以有一个包含对象的大块动态内存,而不是 10000 个彼此分开的小块,从而杀死空间局部性(也就是说,迭代需要为每个元素获取不同的内存部分)。单块方法可以与向量支持的堆栈相媲美,这实际上可以使用std::stack,尽管不是默认值。
  • @HowardWang -- 似乎在编译时为数组指定大小可能会导致内存不足或过度分配内存 -- 这就是为什么“真正" 堆栈类,std::stack 在内部使用 std::deque。您的实现奇怪地有一个指针数组,这没有意义。也许您应该首先使用动态数组/双端队列,然后让您的堆栈类使用它?
  • @HowardWang,是的,这是数组和链表之间的主要区别之一。对于一个大块,您有管理该单个块的开销(例如,“这个块有多大?”)并且所有内容都彼此相邻,因此硬件可以一次获取整个内容。使用单独的分配,您有管理每个分配的开销,除非您不费吹灰之力,否则这些块到处都是。当然,每种方法都有其他优点和缺点。这只是关于内存。

标签: c++ data-structures stack


【解决方案1】:

当我们想要相反顺序的东西时,我们使用的堆栈也需要恒定的时间,这意味着 O(1) 时间来推送和弹出意味着移除或添加它会更快

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

是的,这是实现堆栈的一种方法。定义堆栈的重要因素是 LIFO(后进先出)。所以只要你只是在顶部添加和删除,那就是一个堆栈。把它想象成一堆盘子;如果将 10 个盘子一个一个地放入一个堆叠中,然后一个一个地从该堆叠中取出,则放入的第一个盘子也将是最后一个取出的盘子。您无法移除不在顶部的盘子,因为它被上面的所有盘子覆盖。堆栈数据结构也是如此。

所以你的实现确实是一个堆栈。

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2015-11-15
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    相关资源
    最近更新 更多