标签:
题目:
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
代码:
#include <stdio.h> #include <stdlib.h> #define MAX_LEN_STACK 10 typedef struct { int stackList[MAX_LEN_STACK]; int top; }stack; /*辅助栈空间,存储最小值*/ stack minStack = {0}; /*初始化栈*/ int initStack(stack* s) { if (s == NULL) { return -1; } s->top = -1; minStack.top = -1; } /*获取栈顶元素*/ int top(stack* s) { if (s==NULL || s->top<0) { return -1; } return s->stackList[s->top]; } /*将元素添加到栈里面*/ int push(stack* s, int data) { int topData; if (s->top == MAX_LEN_STACK-1) { return -1; } s->stackList[++(s->top)] = data; /*先修改辅助栈,如果比当前辅助栈的值小,则更新为当前栈,如果比当前大,还用之前的最小值*/ if (minStack.top < 0) { minStack.stackList[++minStack.top] = 0; /*第一个默认为0,这里记录栈下标*/ } else { topData = top(&minStack); if (s->stackList[topData] < data) { minStack.stackList[++minStack.top] = topData; } else { minStack.stackList[++minStack.top] = s->top; /*记录索引值*/ } } return 0; } /*出栈*/ int pop(stack* s) { if (s==NULL || s->top<0) { return -1; } minStack.top--; return s->stackList[s->top--]; } /*获取当前栈的最小值*/ int min(stack* s) { if (s==NULL || s->top<0) { return -1; } return s->stackList[minStack.stackList[minStack.top]]; } /*判断当前栈是否为空*/ bool empty(stack* s) { return (s->top<0) ? true:false; } int main() { stack s; int a[] = {96, 4, 2, 34, 232, 22, 1}; int i; initStack(&s); for (i=0; i<7; i++) { push(&s, a[i]); printf("data %d, min %d\n", a[i], min(&s)); } while (!empty(&s)) { printf("pop %d\n", pop(&s)); printf("min %d\n", min(&s)); } return 0; }
标签:
原文地址:http://blog.csdn.net/yuanwei1314/article/details/43764399