设计包含min函数的栈(栈)

题目:定义栈的数据结构,要求添加一个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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值