您的位置:首页 > 其它

NO.2 设计包含min 函数的栈

2013-02-16 15:33 519 查看
题目:

  定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
  要求函数min、push 以及pop 的时间复杂度都是O(1)。

思路:

  此题初看也是毫无思路的,栈这个结构我们很熟悉,min的时间复杂度为O(1)最先联想的是最小优先级队列,肯定是不可以的。思考发现,栈的特性可以找到的两个O(1)操作只有push和pop,MIN值的结构也是栈的FILO。FIFO与FILO真是世界上所有次序关系的高度概括。因此考虑辅助堆栈。

代码:

//首先建立几个链栈,注意指针的指向与栈的生长方向
class Stack
{
public:
Stack(): base(NULL), top(NULL)
{}

void Push(int elem)
{
StackNode *temp = new StackNode(elem);

if (base == NULL)
{
base = temp;
top = base;
}
else
{
temp->pre = top;
top = temp;
}
}

int Pop()
{
if (base != top)
{
int temp = top->_elem;
StackNode *p = top;
top = top->pre;
delete p;
return temp;
}
else
{
int temp = top->_elem;
delete top;
top = NULL; base = NULL;
}
return NULL;
}

int Get()
{
if (top != NULL)
{
return top->_elem;
}

return NULL;
}

bool Empty()
{
if (top != NULL)
{
return false;
}
return true;
}

private:
StackNode *base;
StackNode *top;

};


class MinStack : public Stack
{
public:
int Min()
{
return stack.Get();
}

void Push(int elem)
{
Stack::Push(elem);//调用基类PUSH
if (stack.Empty() || elem <= stack.Get())
{
stack.Push(elem);
}
}

int Pop()
{
int elem = Stack::Pop();//调用基类POP
if (elem == stack.Get())
{
stack.Pop();
}
return elem;
}

private:
Stack stack; //辅助栈,保持MIN
};


总结:

堆栈结构本身是简单的,但是又有回溯法、递归调用的复杂应用,基本的Coding是远远不够的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: