【微软100面试题实现】第02题:设计包含min函数的栈

来源:互联网 发布:手机淘宝首页广告位 编辑:程序博客网 时间:2024/06/08 01:20

微软100面试题实现:第02题

题源自:http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html


题目:

定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。

要求函数min、push以及pop的时间复杂度都是O(1)。


实现:

/* *【samu 2012-11-08】v0.1 * 设计一个含min函数的栈 */#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define STACK_INIT_SIZE 100;//存储空间初始分配量#define STACKINCREMENT10;//存储空间分配增量#define MAX_INT 100000000;//栈的结构typedef struct{int *base;                          //栈的基指针int *top;                            //栈的头指针int stacksize;                     //栈的容量值}Stack;int initStack(Stack &s)//栈的初始化{//构造一个空栈Ss.stacksize = STACK_INIT_SIZE;s.base = (int*) malloc (s.stacksize*sizeof(int));if(!s.base){exit(0);}s.top = s.base;//头指针和基指针相同return 0;}int pop(Stack &s)//出栈{if(s.top - s.base == s.stacksize){printf("出错:栈已空不能出栈\n");return -1;}int value = *(--s.top);return value;}int push(Stack &s, int value){if(s.top - s.base >= s.stacksize){s.stacksize = s.stacksize + STACKINCREMENT;s.base = (int*)realloc(s.base,(s.stacksize)*sizeof(int));if(!s.base){printf("错误:push操作时栈满,申请内存空间出错!\n");return 0;}s.top = s.base+s.stacksize;}*s.top++ = value;return value;}int min(Stack &s){int min = MAX_INT;int temp = min;while(s.top != s.base){temp =  pop(s);printf("出栈:%d\n",temp);if(min > temp){min = temp;}}return min;}int main(){int minNumber;int array[7] = {5,7,1,5,6,2,9};        Stack s;initStack(s);    //栈的初始化              for(int i = 0; i<7; ++i){push(s,array[i]);}        minNumber = min(s);printf("最小的数为:%d\n",minNumber);return 0;}
运行结果:


分析:

开始时下面这行语句是

s.stacksize = s.stacksize + STACKINCREMENT;s.base = (int*)realloc(s.base,(s.stacksize)*sizeof(int));
写成

    

                 s.base = (int*)realloc(s.base,(s.stacksize +STACKINCREMENT )*sizeof(int));  //出错了
但该语句编译时报错了,说语句语法有问题

后来改成

                 s.base = (int*)realloc(s.base,(s.stacksize +STACKINCREMENT )*sizeof(int));  //正确

所以应该是STACKINCREMENT不能在remalloc函数中出现,导致出错,但为什么#define 常量不能在函数参数中使用呢?。。。




原创粉丝点击