【问题标题】:dynamic stack using arrays C++使用数组 C++ 的动态堆栈
【发布时间】:2019-02-02 02:33:28
【问题描述】:

我是一名学生,我的老师给了我这个“家庭作业”。 我必须建立一个动态堆栈,微不足道的部分是我不能使用列表结构(例如链表)。我认为数组实现是赌注,但在开发过程中,我不得不增加数组大小。我不知道如何在不丢失数据的情况下增加大小。有人可以帮我吗?

【问题讨论】:

  • 您可以使用std::vector 吗?如果不这样做的话:P
  • 做一个更大的数组,把旧的复制到新的,删除旧的,把新的设为旧的。
  • 你的任务是实现一个类似于 std::stack 的类吗?您是否允许使用其他容器类型?也许如果您发布您现在拥有的代码,它会更容易提供帮助
  • 我想你可能误解了“琐碎”的意思。
  • 一个选项是创建另一个更大的数组并复制内容,删除旧的。如果您已经上过关于 STL(标准模板库)的课程,那么您的教授可能正在看着您理解和使用它。在这里分享你的代码,有很多人愿意帮助你。

标签: c++ arrays dynamic stack


【解决方案1】:

您可以做的一件事是创建一个具有新大小的新数组,然后将旧数组复制到其中。像这样的东西就是你要找的东西?

const int new_size = old_size + 1;
int new_array[new_size];
std::copy(old_array, old_array+old_size, new_array);

【讨论】:

  • 请不要将数组增加一。那是非常低效的。内存很便宜,所以你应该把它加倍以保持数组需要增长的次数。
  • 出于性能原因,如果您希望再次增加大小,您可能希望将大小增加 1 以上。
  • 谢谢大家的cmets。我认为这是我一直在寻找的,显然我会加倍,因为我没有内存泄漏或其他问题。再次感谢您!
  • 您可能有兴趣查看 std::vector 的想法。我的意思是std::vectorcapacitysize。您可能希望您的向量使用这些概念。 stackoverflow.com/questions/6296945/…
  • @drescherjm 抱歉,我不能使用向量
【解决方案2】:

我假设您不允许使用std::vector,并且您必须使用动态内存分配。

在这种情况下,当您当前分配的数组空间不足时,您必须执行以下操作:

  • 创建一个大于当前数组大小的数组

  • 将当前数组复制到新数组

  • 将新数组设为当前数组

  • 删除旧数组

这里有一个简单不完整类来说明这个想法。

#include <iostream>
#include <algorithm>
using namespace std;

class myStack
{
    size_t capacity {0};
    size_t size {0};
    int *data {nullptr};
public: 
    void push(int n)
    {
        if (size == capacity)
        {
            cout << "Increase capacity by 5 elements" << endl;
            capacity += 5;
            int* tmp = new int[capacity];
            copy_n(data, size, tmp);
            swap(data, tmp);
            delete[] tmp;
        }

        data[size] = n;
        ++size;
    }

    void print_all()
    {
        cout << "capacity=" << capacity << endl;
        for (size_t i = 0; i < size; ++i)
            cout << data[i] << " ";
        cout << endl;
    }
};

int main(void) {
    myStack s;
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(4);
    s.push(5);
    s.print_all();
    s.push(6);
    s.print_all();
    return 0;
}

输出:

Increase capacity by 5 elements
capacity=5
1 2 3 4 5 
Increase capacity by 5 elements
capacity=10
1 2 3 4 5 6 

剩下的留给你练习(例如析构函数删除分配的内存,顶部读取数据,弹出删除元素等)可能你还想把它变成一个模板,这样你就可以处理其他数据类型比int 具有相同的代码。

注意:这个简单的类只会在必要时将容量增加 5。一种更常见的方法是在需要增加容量时将容量增加一倍。我也会把它留给你,以便你练习。

【讨论】:

  • 是的,其他方法刚刚完成,这是完全正确的,当我说我的意思是我正在寻找的东西时。不清楚的一件事是 ptr *data
  • @man_o_war "有一点不清楚的是 ptr *data" 嗯,它是一个指向实际堆栈数据存储位置的指针
  • 如果我将类转换为模板,堆栈将不允许我访问使用 [] 运算符,即使我重新定义它使其返回 T& 值,您有什么建议吗?也许我可以发布另一个问题并发布我现在拥有的代码
  • @man_o_war 很难说没有看到你的确切代码。一个新问题对我来说听起来不错
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 2016-03-15
  • 1970-01-01
  • 2014-12-14
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2014-08-15
相关资源
最近更新 更多