设计包含min函数的栈(栈)
2013-01-29 21:18
218 查看
题目:定义栈的数据结构,要求添加一个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 //栈节点的数据结构
{
int value;
struct stack_node* front;
struct stack_node* here_min;
//加入了指向“此刻”最小值节点的指针
}stack_node;
typedef struct stack //栈数据结构
{
stack_node* top;
int count;
}stack;
stack* create() //建栈
{
stack* s=(stack*)malloc(sizeof(stack));
s->top=NULL;
s->count=0;
return s;
}
void push(stack* s,int value)
{
if(s->top==NULL)
{
s->top=(stack_node*)malloc(sizeof(stack_node));
s->top->value=value;
s->top->front=NULL;
s->top->here_min=s->top;
(s->count)++;
}
else
{
stack_node* temp=(stack_node*)malloc(sizeof(stack_node));
temp->front=s->top;
(s->count)++;
if(value<(s->top->here_min)->value)
temp->here_min=temp;
else
temp->here_min=s->top->here_min;
s->top=temp;
s->top->value=value;
}
}
void pop(stack* s)
{
if(s->top==NULL)
printf("the stack is empty!\n");
else
{
stack_node* temp=s->top;
s->top=s->top->front;
free(temp);
(s->count)--;
}
}
int min(stack* s)
{
return
s->top->here_min->value;
}
void delete_stack(stack* s)
{
while((s->top)!=NULL)
{
stack_node* temp=s->top;
s->top=s->top->front;
free(temp);
}
free(s);
}
int main()
{
int i,n,value;
stack* s=create();
printf("Input how many numbers you want to push in the
stack:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&value);
push(s,value);
printf("%d\n",min(s));
}
pop(s);
printf("count=%d\n",s->count);
delete_stack(s);
return 0;
}
要求函数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 //栈节点的数据结构
{
int value;
struct stack_node* front;
struct stack_node* here_min;
//加入了指向“此刻”最小值节点的指针
}stack_node;
typedef struct stack //栈数据结构
{
stack_node* top;
int count;
}stack;
stack* create() //建栈
{
stack* s=(stack*)malloc(sizeof(stack));
s->top=NULL;
s->count=0;
return s;
}
void push(stack* s,int value)
{
if(s->top==NULL)
{
s->top=(stack_node*)malloc(sizeof(stack_node));
s->top->value=value;
s->top->front=NULL;
s->top->here_min=s->top;
(s->count)++;
}
else
{
stack_node* temp=(stack_node*)malloc(sizeof(stack_node));
temp->front=s->top;
(s->count)++;
if(value<(s->top->here_min)->value)
temp->here_min=temp;
else
temp->here_min=s->top->here_min;
s->top=temp;
s->top->value=value;
}
}
void pop(stack* s)
{
if(s->top==NULL)
printf("the stack is empty!\n");
else
{
stack_node* temp=s->top;
s->top=s->top->front;
free(temp);
(s->count)--;
}
}
int min(stack* s)
{
return
s->top->here_min->value;
}
void delete_stack(stack* s)
{
while((s->top)!=NULL)
{
stack_node* temp=s->top;
s->top=s->top->front;
free(temp);
}
free(s);
}
int main()
{
int i,n,value;
stack* s=create();
printf("Input how many numbers you want to push in the
stack:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&value);
push(s,value);
printf("%d\n",min(s));
}
pop(s);
printf("count=%d\n",s->count);
delete_stack(s);
return 0;
}
相关文章推荐
- 设计包含min函数的栈
- 设计包含min函数的栈
- 面试题之堆栈队列系列一:设计包含min函数的栈
- 设计包含min函数的栈
- 面试100题:2.设计包含min函数的栈
- 请设计包含min函数的栈,定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素
- 设计包含min函数的栈
- 设计包含min函数的栈[数据结构]
- 设计包含min函数的栈
- [微软面试100题] 设计包含min函数的栈
- 算法习题3:设计包含min函数的栈
- 数据结构练习(02)设计包含min函数的栈
- 设计包含min函数的栈
- 设计包含min函数的栈
- 程序员面试题精选100题(02)-设计包含min函数的栈[数据结构] - c实现
- 程序员面试题精选100题(02)-设计包含min函数的栈
- 设计包含min函数的栈
- No.2 设计包含min函数的栈 No.3 求子数组的最大和
- 设计包含min函数的栈
- 面试题之堆栈队列系列一:设计包含min函数的栈