设计包含 min 函数的栈

原创 2013年12月03日 20:24:27

题目:

定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。要求函数 min、push 以及pop 的时间复杂度都是 O(1).


程序执行之后的结果:

程序执行结果

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

#include <stdlib.h>
#include <stdio.h>

#define STACK_INIT_SIZE 50
#define STACK_INCREMNET 20

#define SElemType int

typedef struct min_stack{
	int * top;
	int * base;
	int stacksize;
}min_stack;

typedef struct seq_stack{
	SElemType * top;
	SElemType * base;
	int stacksize;
	min_stack *min;
}stack;

int init_stack(stack *s);
int destroy_stack(stack *s);
int clear_stack(stack *s);

int getlen(stack s);
int is_empty(stack s);
int is_full(stack s);

int get_top(stack s,SElemType *e);
int push(stack *s,SElemType n);
int pop(stack *s,SElemType *n);
int get_min(stack *s, SElemType *n);

int stack_traverse(stack s);

#endif

#include "stack.h"

int init_stack(stack *s){
    s->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!s->base)
    	return 1;
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;

    s->min=(min_stack *)malloc(sizeof(min_stack));
    s->min->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
    if(!s->min->base)
    	return 1;
    s->min->top=s->min->base;
    s->min->stacksize=STACK_INIT_SIZE;

    printf("\nA new stack with min stack has been established!\n");
    return 0;
}

int destroy_stack(stack *s){
    if(!s)
        return 0;
    if(s->min){
        free(s->min->base);
        free(s->min);
        s->min=NULL;
    }
    free(s->base);
    s->base=s->top=NULL;
    s->stacksize=0;
    printf("\nThe stack has been destroyed!\n");
    return 0;
}
int clear_stack(stack *s){
    if(!s)
        return 0;
    s->top=s->base;
    s->min->top=s->min->base;
    return 0;
}

int getlen(stack s){
	return (s.top-s.base);
}
int is_empty(stack s){
	return s.base==s.top;
}
int is_full(stack s){
	return (s.top-s.base==s.stacksize);
}

int get_top(stack s,SElemType *e){
    if(s.base==s.top)
        return 0;
    *e=*(s.top-1);
    return 0;
}

/*
 * 下面这三个函数的实现才是该题目的重点!
 * */

int push(stack *s,SElemType n){
	int min_index=-1;
	if(s->min->top != s->min->base){
		min_index= *(s->min->top-1);
	}

    if(s->top-s->base>=s->stacksize)
    {
        s->base=(SElemType *)realloc(s->base,sizeof(SElemType)*(s->stacksize+STACK_INCREMNET));
        if(!s->base)
            return 0;
        s->top=s->base+s->stacksize;
        s->stacksize+=STACK_INCREMNET;
    }
    if(s->min->top-s->min->base>=s->min->stacksize)
    {
        s->min->base=(int *)realloc(s->min->base,sizeof(int)*(s->min->stacksize+STACK_INCREMNET));
        if(!s->min->base)
            return 0;
        s->min->top=s->min->base+s->min->stacksize;
        s->min->stacksize+=STACK_INCREMNET;
    }

	*s->top++=n;
	/* 如果2个数相等且都是最小值,则取先进栈的为最小值 */
	if(min_index== -1){
		*s->min->top++=0;
	}else if(*(s->base+min_index)>n)
		*s->min->top++=(s->top-s->base-1);

	return 0;
}
/*
 * @指针n指向的内存位置存储栈中的退栈元素
 * */
int pop(stack *s,SElemType *n){
	int min_index=-1;

    if(s->base==s->top)
        return 0;
	if(s->min->top != s->min->base){
		min_index= *(s->min->top-1);
	}else
		return 1;

    if(s->top-s->base-1 == min_index){
    	s->min->top--;
    }
	*n= *(--s->top);
	return 0;
}
/*
 * @指针n指向的内存位置存储栈中的最小值
 * @返回最小值的索引
 * */
int get_min(stack *s, SElemType *n){
	int min_index=-1;
	if(s->min->top != s->min->base){
		min_index= *(s->min->top-1);
	}
	*n=*(s->base+min_index);
	return min_index;
}
/*
 * 按进栈顺序输出
 * */
int stack_traverse(stack s){
    SElemType* e;
    int *min,i=0;
    if(s.top==s.base){
       printf("This stack is empty!");
       return 0;
    }

    e=s.base;
    min=s.min->base;

    printf("栈中元素按进栈顺序依次为:\n");
    for(;e<s.top;e++,i++){
         printf("%d\t",*e);
         if(i%6==5)
            printf("\n");
    }
    i=0;
    printf("\n栈中最小元素序号依次为:\n");
    for(;min<s.min->top;min++,i++){
         printf("%d\t",*min);
         if(i%6==5)
            printf("\n");
    }
    return 0;
}

测试Stack:

/*
 * main.c
 *
 *  Created on: Dec 3, 2013
 *      Author: bing
 *
 *  test sequence stack
 */

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

int main()
{
    stack s;
    SElemType i,p;

    init_stack(&s);
    for(i=20;i>10;i--)
        push(&s,i);
    for(i=1;i<=10;i++)
        push(&s,i);
    stack_traverse(s);
printf("\n开始退栈....\n");
    for(i=15;i>0;i--)
        pop(&s,&p);
    stack_traverse(s);

    destroy_stack(&s);

    return 0;
}

编码水平太差,不对的地方请指正!

相关文章推荐

面试题---设计包含min函数的栈

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 要求函数min、push以及pop的时间复杂度都是O(1)。 结合链表一起做。 首先我做插入以下数字:10,7,3,3,...

【老鸟学算法】包含 min函数的栈设计——java实现

要求: 1. 定义栈的数据结构,要求添加一个 min函数,能够得到栈的最小元素。 2. 要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。 这是考验“栈”数据结构设计。众...
  • oh_Maxy
  • oh_Maxy
  • 2013年09月10日 17:36
  • 1985

第2题:设计包含min函数的栈

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/44620511第2题:定义栈的数据结构,要求添加一个min函数,能够得...

2.设计包含min函数的栈

声明:此题目来自 v_JULY_v的blog,出处http://blog.csdn.net/v_july_v/article/details/6004660 代码经过本人调试,不敢保证是最优的,但应...

程序员面试题精选100题(02)-设计包含min函数的栈—python实现

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。作者:liuyuan_jq2011-07-13题目:定义栈的数据结构,...

设计包含min函数的栈

本文转自:http://zhedahht.blog.163.com/blog/static/25411174200712895228171/题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的...

笔试题:设计包含min 函数的栈

题目:设计包含min 函数的栈。定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。要求函数min、push 以及pop 的时间复杂度都是O(1)。 解答:开始的时候很容易想到...

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

设计包含min函数的栈: 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素; 要求函数min、push以及pop的时间复杂度都是O(1)。 分析:        ...

算法与数据结构面试题(2)-设计包含min 函数的栈

题目 设计包含min 函数的栈。 定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。 要求函数min、push 以及pop 的时间复杂度都是O(1)。 个人解题思路 1.存...

[程序员面试题精选100题]2.设计包含min函数的栈

【题目】 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。 【分析】 是去年google的一道面试题。 我看到这道题目...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计包含 min 函数的栈
举报原因:
原因补充:

(最多只允许输入30个字)