【剑指offer】面试题21:包含min函数的栈
来源:互联网 发布:mac 声音调节 编辑:程序博客网 时间:2024/05/16 19:14
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。在该栈中,调用min,push和pop时间复杂度都是O(1)
题目解析:
要得到栈的最小值,我们可以通过一个变量,来保存整个入栈过程中的最小值。但是问题来了,如果将最小数据出栈了以后,剩下的最小值如何来保存?
一种很直接的方法,我可以另外设一个“序列”,里面的元素排序,入栈的同时,也把当前节点插入到这个序列当中。不过由于要插入,这样复杂度就不是O(1)了。换个角度考虑,我们每次在这个序列当中,每次放入节点的同时,也把当前整个栈中的最小值放入序列中,比如3,3,2,2,1……这样当我们出栈时,将最小值退出栈,响应的序列最小值也会变化。
完整代码如下:
#include <stdio.h>#include <stdlib.h>#define TRUE 1#define FALSE 0#define STACKINIT 50#define STACKINCREMENT 10typedef struct StackNode{ int *base; int *top; int stacksize;}StackNode;int PopMin(StackNode SMin,int *e);void InitStack(StackNode *S);void Push(StackNode *S,StackNode *SMin,int e);int PopStack(StackNode *S,StackNode *SMin,int *e);int main(void){ int n,flag; char ch; StackNode st,smin; InitStack(&st); InitStack(&smin); while(scanf("%c",&ch) == 1){ switch(ch){ case 'a': printf("push:"); scanf("%d",&n); Push(&st,&smin,n); break; case 'b': flag = PopStack(&st,&smin,&n); if(flag) printf("popstack:%d\n",n); else printf("the stack is empty!\n"); break; case 'c': flag = PopMin(smin,&n); if(flag) printf("popmin:%d\n",n); else printf("the stack is empty!\n"); break; default: printf("please input a/b/c\n"); } while(getchar() != '\n') ; } return 0;}void InitStack(StackNode *S){ S->base = (int *)malloc(STACKINIT * sizeof(int)); if(!(S->base)) exit(-1); S->top = S->base; S->stacksize = STACKINIT;}void Push(StackNode *S,StackNode *SMin,int e){ if(S->top - S->base >= S->stacksize){ S->base = (int *)realloc(S->base,(S->stacksize + STACKINCREMENT) * sizeof(int)); if(!(S->base)) exit(-1); S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *(S->top) = e; ++S->top; if(SMin->top - SMin->base >= SMin->stacksize){ SMin->base = (int *)realloc(SMin->base,(SMin->stacksize + STACKINCREMENT) * sizeof(int)); if(!(SMin->base)) exit(-1); SMin->top = SMin->base + SMin->stacksize; SMin->stacksize += STACKINCREMENT; } if(*(SMin->top-1) > e) *(SMin->top) = e; else *(SMin->top) = *(SMin->top - 1); SMin->top++;}int PopStack(StackNode *S,StackNode *SMin,int *e){ if(S->top == S->base) return FALSE; *e = *(--S->top); --SMin->top; return TRUE;}int PopMin(StackNode SMin,int *e){ if(SMin.top == SMin.base) return FALSE; *e = *(SMin.top - 1); return 1;}
0 0
- [剑指offer][面试题21]包含min函数的栈
- 剑指offer 面试题21:包含min函数的栈
- 【剑指offer】面试题21:包含min函数的栈
- 【剑指offer】面试题21:包含min函数的栈
- 剑指Offer:面试题21 包含min函数的栈
- 剑指offer 面试题21 包含min函数的栈
- 《剑指Offer》面试题21:包含min函数的栈
- 剑指offer面试题21-包含min函数的栈
- 剑指offer-面试题21:包含min函数的栈
- 剑指Offer----面试题21:包含min函数的栈
- 剑指offer-面试题21:包含min函数的栈
- 剑指offer面试题21:包含min函数的栈
- 剑指Offer面试题21:包含min函数的栈
- 剑指offer--面试题21:包含min函数的栈
- 剑指Offer---面试题21:包含min函数的栈
- 剑指offer-面试题21-包含min函数的栈
- 【剑指offer】面试题21:包含min函数的栈
- 【面试题】剑指Offer-21-包含Min函数的栈
- statTaskService
- S3C2440的存储器映射(4GB)
- oracle选择排行前几的记录
- HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (二)
- 使用sae定时任务实现终身自动发表微博(PHP实现)
- 【剑指offer】面试题21:包含min函数的栈
- 黑马程序员_Java函数的重载与重写(覆盖)
- Timer类
- 黑马程序员_java中的String类常用的方法
- 虚拟机网络连接方式
- 数据库字段类型
- Redis复习笔记5—Redis主从复制
- Timer的缺陷
- SpringMVC常用基础知识