以下场景中的数据结构是什么? (最大堆叠)

时间:2010-04-10 17:39:56

标签: data-structures

请注意,内存没有限制。 我需要从1到1000插入int。

我可以在常量顺序时间内执行以下每项操作:

  1. push():添加到顶部
  2. pop():删除顶部元素
  3. getMax():返回最大元素
  4. 请建议我适当的数据结构。

2 个答案:

答案 0 :(得分:3)

由于没有内存限制,我将使用2个向量 - 一个用于堆栈上的实际数据,另一个用于跟踪堆栈中每个状态的最大值。
为简单起见,我假设这个堆栈只保留+ ve int 我知道这没有任何错误检查。但我只是在这里提供数据结构的想法,而不是完整的解决方案。

class StackWithMax
{
 public:
  StackWithMax() : top(-1), currentMax(0) { }
  void push(int x);
  int pop();
  int getMax() { return m[top]; }
 private:
  vector<int> v; // to store the actual elements
  vector<int> m; // to store the max element at each state
  int top;
  int currentMax;
};

void StackWithMax::push(int x)
{
  v[++top] = x;
  m[top] = max(x, currentMax);
}

int StackWithMax::pop()
{
  int x = v[top--];
  currentMax = m[top];
  return x;
}

答案 1 :(得分:-1)

使用普通堆栈结构和计数器的附加数组 int c[1..1000]和变量int maxVal=0

在代码中添加堆栈操作后的操作:

On push(x) -> c[x]++ ; maxVal = max(x,maxVal)
On pop():x -> c[x]-- ; if (c[x] == 0) { j=x; while(c[--j] == 0); maxVal = j; }

maxVal应始终具有最大值。

也许我错了,这应该具有摊销的计算复杂度O(1)。 自从我分析算法以来已经很长时间了。