数据结构与算法面试题80道(二)
2.设计包含min函数的栈。
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。
要求函数min、push以及pop的时间复杂度都是O(1)。
思路:push时候 如果 v_push >= min, v_push 直接入栈, 如果 v_push < min, 那么入栈的是 (v_push <<1)- min, 然后 min = v_push. 出栈时, 如果栈顶的top >= min 直接出,如果 top < min 则出现异常,将min作为pop的返回值,另外需要还原前一个最小值,方法是 min = (min<<1) - top。代码很简单,就不写注释了。
#include<cstdio> #include<iostream> #include<malloc.h> using namespace std; typedef int ElemType; typedef int Status; typedef struct node{ int m_value; struct node* next; }Node; typedef struct { ElemType min_elem;//min element unsigned int stacksize;//stack size Node *top; }MinStack; //stack has empty? bool stackEmpty(MinStack s){ return s.top==NULL; } //initialize stack void InitStack(MinStack & s){ s.top= NULL; s.stacksize=0; } bool push(MinStack &s,ElemType e){ if(stackEmpty(s)){ s.top=(Node*)malloc(sizeof(Node)); if(!s.top){ printf("malloc error.\n"); return false; } s.top->m_value= e; s.top->next=NULL; s.stacksize=1; s.min_elem=e; }else{ Node* pNode=(Node*)malloc(sizeof(Node)); if(!pNode){ printf("malloc error.\n"); return false; } cout<<e<<endl; if(e>=s.min_elem) pNode->m_value=e; else { pNode->m_value=(e<<1)-s.min_elem; s.min_elem=e; } pNode->next=NULL; pNode->next=s.top; s.top=pNode; s.stacksize++; } return true; } Status pop(MinStack& s,ElemType &e){ if(!stackEmpty(s)){ Node* pNode = s.top; if(s.min_elem<s.top->m_value) e=s.top->m_value; else e=(s.min_elem<<1)-s.top->m_value; free(pNode); return e; } cout<<"栈为空"<<endl; return -1; } Status getTop(MinStack s,ElemType &e){ if(!stackEmpty(s)){ if(s.min_elem<s.top->m_value) e=s.top->m_value; else e=(s.min_elem<<1)-s.top->m_value; return e; } cout<<"栈为空"<<endl; return -1; } Status min(MinStack s){ ElemType e; if(!stackEmpty(s)){ e=s.min_elem; return e; } cout<<"栈为空"<<endl; return -1; } int main(){ ElemType e; MinStack s; InitStack(s); printf("请输入入栈的数字(0 to quit)\n"); while(~scanf("%d",&e)){ if(!push(s,e)){ printf("入栈出问题。\n"); } printf("minelem:%d\n",min(s)); } pop(s,e); e=min(s); printf("栈顶出栈后,栈的最小值为: %d\n",e); return 0; }