题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
分析:刚看到题目时想到用一个“指针”指示栈中最小的元素的位置,这样就可以在O(1)的时间内查找栈中的最小值,但仔细一想,若按以上方案做,push、min是没有问题的,但当pop时,若需要pop的正好是那个最小元素,那pop后就需要重新找这个最小点,这时时间复杂度就不会再是O(1)。经过仔细考虑,得出正确解决方案:用一个辅助栈来存储最小值经历过的位置,每次push以后,辅助栈中也加入一个节点来存储新的最小值位置(或者仍存以前的位置,但是要是新的节点),每次pop之后,删除辅助栈中相应的节点。这样虽然占用了更多的空间,但却达到了目的。再次经过思考,得到更优的正确解决方案:同样需要记录每插入一个值后最小值的位置(n个值就要记录n个最小位置),但是这些最小位置不再放在一个辅助栈中,而是在原来的栈节点的数据结构中加入一个指针变量(指向栈节点),用来指示“此时”的最小值节点。
下面的C语言代码,可供参考:
#include<stdio.h>
#include<stdlib.h>
typedef struct stack_node
{
}stack_node;
typedef struct stack
{
}stack;
stack* create()
{
}
void push(stack* s,int value)
{
}
void pop(stack* s)
{
}
int min(stack* s)
{
}
void delete_stack(stack* s)
{
}
int main()
{
}