【发布时间】: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