C ++中的堆栈实现,没有最大堆栈大小限制

时间:2018-07-21 06:33:07

标签: c++ data-structures stack

我想用C ++实现一个堆栈,该堆栈的堆栈大小没有任何最大限​​制。

#include<bits/stdc++.h>
using namespace std;

#define MAX 1000

class Stack
{
    int top;
public:
    int a[MAX]; //Maximum size of Stack

    Stack() { top = -1; }
    bool push(int x);
    int pop();
    bool isEmpty();
};

每次创建对象时,有什么方法可以使MAX取不同的值吗?

2 个答案:

答案 0 :(得分:3)

简单(显而易见)的答案是使用vol <- vol %>% group_by(year, month) %>% mutate(d1 = ifelse(vol >= mean(vol),1,0)) %>% ungroup() 。然后您的堆栈将无限制地增长,因此根本不需要std::vector

如果出于某些原因不允许使用MAX,则另一种选择是使用模板

std::vector

在此解决方案中,template <int MAX> class Stack { int top; public: int a[MAX]; //Maximum size of Stack Stack() { top = -1; } bool push(int x); int pop(); bool isEmpty(); }; 是编译时间常数。即没关系

MAX

但这不是

Stack<10> s;

最终(也是最糟糕的)解决方案是使用int size = ...; Stack<size> s; new进行动态内存分配。除非被明确禁止,否则您应该更喜欢delete而不是动态内存分配。

顺便说一句,公开堆栈的元素是一个非常的坏主意,就像上面对std::vector所做的那样。

答案 1 :(得分:1)

使用std::vector的解决方案:

在此实现中,堆栈实际上没有限制。您可以在构造函数中传递提示大小,只是为了预分配一些空间,以便更快地填充堆栈。但是,如果超出此限制,std::vector将自动增加其存储空间:

#include <cassert>
#include <vector>

class Stack
{
    std::vector<int> stack;
public:

    Stack(std::size_t size = 1000) {
        // reserving the underlying storage space makes the stack faster
        // to fill because no memory reallocation is neeeded
        // for the 'size' first elements.
        stack.reserve(size);
    }

    // doesn't return a bool anymore because every push is supposed to succeed
    // (or fail with an exception if no more memory is available)
    void push(int x) {
        // 'stack' will grow the underlying storage space if needed
        stack.push_back(x);
    }
    int pop() {
        assert(!stack.empty());
        auto res = stack.back();
        stack.pop_back();
        return res;
    }
    bool isEmpty() {
        return stack.empty();
    }
};