我想用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取不同的值吗?
答案 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();
}
};