设计包含min函数的栈:
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素;
要求函数min、push以及pop的时间复杂度都是O(1)。
分析:
要得到当前栈的最小元素,且时间复杂度为O(1),这不但要求知道当前栈中的最小元素值(或其所在位置),而且要知道次小元素,这样才能保证,如果当前栈顶元素为最小元素,被pop后,还能以O(1)的时间复杂度找到次小元素。这样依次类推,我们可以发现,在最苛刻的情况下(所有栈元素以从大到小的顺序入栈),需要一个和栈大小一样的辅助栈来满足时间复杂度O(1)的要求。这应该是一种典型的以空间换时间吧。
基于以上分析,以int类型为例(当然可以使用模板、泛型),我们可以定义栈结构如下:
struct MinStackElement
{
int data;//the value of element
int indexOfMin; // the index of the min element
};
struct MinStack
{
MinStackElement * data; //stack element
int size; // num of elements
int top; // top pointer
};
//stack initialization
MinStack MinStackInit(int maxSize)
{
MinStack stack;
stack.size = maxSize;
stack.data = (MinStackElement*) malloc(sizeof(MinStackElement)*maxSize);
stack.top = 0;
return stack;
}
void MinStackFree(MinStack &stack)
{
free(stack.data);
}
//push
void MinStackPush(MinStack &stack, int d)
{
if (stack.top == stack.size)
{
printf(" out of stack space.\n");
return;
}
MinStackElement* p = &stack.data[stack.top];
p->data = d;
if(stack.top==0)
p->indexOfMin=0;
else
{
if (stack.data[ (stack.data[stack.top-1].indexOfMin) ].data>d)
p->indexOfMin= stack.top;
else
p->indexOfMin=stack.data[stack.top-1].indexOfMin;
}
stack.top ++;
}
//pop
int MinStackPop(MinStack& stack)
{
if (stack.top == 0)
{
printf("stack is empty! \n" );
return -1;
}
stack.top--;
return stack.data[stack.top].data;
}
// get the min element
int MinStackMin(MinStack& stack)
{
if (stack.top == 0)
{
printf("stack is empty! \n" );
return -1;
}
return stack.data[ ( stack.data[stack.top-1].indexOfMin) ].data;
}
<wbr style="line-height:28px; color:rgb(51,51,51); font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,u5b8bu4f53; font-size:16px; background-color:rgb(204,206,208)"><span style="line-height:28px; color:rgb(51,51,51); font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,u5b8bu4f53; font-size:16px; background-color:rgb(204,206,208)">
上面的方法是通过设置当前栈中的最小元素所在位置来获取最小值,当然也可以通过直接记录当前栈中的最小值得方法来获取最小值,而且这样会更简单些。</span>
</wbr>
分享到:
相关推荐
实现一个栈,要求使用O(1)时间获取栈中最小值,O(1)执行pop、push操作。
标题中的“包含min函数的栈1”指的是一个特殊的栈数据结构,它除了具有常规栈的基本功能(push、pop和top)之外,还提供了一个额外的min函数,可以在常数时间内返回栈内当前最小元素。这样的设计是为了解决在处理一...
包含min函数的栈.md
python 实现 包含min函数的栈
java基础面试题包含min函数的栈本资源系百度网盘分享地址
c++ c++_剑指offer题解之包含min函数的栈
本文实例讲述了Python实现包含min函数的栈。分享给大家供大家参考,具体如下: # coding=utf8 ''' 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。 在该栈中,调用min、push及pop的...
python python_剑指offer第20题包含min函数的栈
剑指Offer(Python多种思路实现):包含min函数的栈 面试30题: 题目:包含min函数的栈 题:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min、push、pop的时间复杂度都是O(1) ...
30. 包含 min 函数的栈题目链接牛客网题目描述实现一个包含 min() 函数的栈,该方法返回当前栈中最小的值。在对栈进行 push 入栈和 pop 出栈操
面试题30. 包含min函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复
面试题30:包含min函数的栈题目定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。方法准备一个辅助栈,每次都把最小的元素(之前的最小元素
20 - 包含min函数的栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。# 每次pop操作时需
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。void push(int value) {这是对两个栈进行操作的一个题目,push,po
代码type MinStack struct {a []int//存储元素b []int //辅助栈 维护栈的最小值/* initialize your dat
不要急于写代码,了解清楚所要解决的问题,多和面试官沟通,然后开始做一些整体的设计和规划。不要急于提交,自己测试几个用例避免错误。 4. 良好的代码风格。命名规则,缩进对齐习惯。能够单元测试用例。 5. 项目介绍...
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。 示例: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push...
包含min的最小栈题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的 min 函数。public void push(int num) {pub
2. 设计包含min函数的栈 这个问题考察了栈数据结构的实现和min函数的实现。要求设计一个栈数据结构,添加一个min函数,能够得到栈的最小元素,且min函数、push函数和pop函数的时间复杂度都是O(1)。 这个问题的解决...