您的位置:首页 > 其它

设计包含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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: