首页 > 代码库 > Min Stack (10)
Min Stack (10)
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
题目意思很简单,即建立一个stack,除了最基本的push pop top 三大函数之外,这个堆栈还能够返回堆栈中的最小值。整个题目完成以后,我有两种解题思路,并付诸实现了。
第一种解题思路是自定义stack 结点,在结点中定义一个指针用来储存存入这个元素之后stack中最小元素的位置。代码如下,很失望的是,leetcode显示内存超限。看来这种方法不行啊。先把代码贴出来吧。
1 class node{ 2 public: 3 int value; 4 node *ptr,*next; 5 node(int value=http://www.mamicode.com/0){ 6 this->value=http://www.mamicode.com/value; 7 ptr=next=NULL; 8 } 9 };10 class stack{11 private:12 node *min;13 node *head;14 public:15 stack(){16 head=NULL;17 min=NULL;18 }19 void pop(){20 if(!head)21 return;22 node *link=head;23 head=head->next;24 delete link;25 }26 27 void push(int x){28 node *link=head;29 node *temp=new node(x);30 if(!head){31 min=temp;32 }33 else{34 if(x<=min->value){35 min=temp;36 }37 }38 temp->ptr=min;39 temp->next=head;40 head=temp;41 }42 node *top(){43 return head;44 }45 int m(){46 if(!head)47 return -1;48 return head->ptr->value;49 }50 51 };
另外一种方法是用两个stack s,t,s用来储存真实的数据,t专门用来存储最小的数据。这里的最小的定义是当前size的stack中最小的数据。当执行pop指令时,如果pop出的数据等于最小数据时才将t弹出一个。当压入数据的时候,只有要压入的数据小于t栈顶的数据时才将其压入t,否则只压入s.这样的话节省了一部份空间,不用对s中每一个位置的元素都在t中存储该位置对应的最小元素。ps:不按这种做法,会显示内存超出限制。
先贴出内存超限的代码:
1 class MinStack { 2 public: 3 stack<int>s; 4 stack<int>t; 5 void push(int x) { 6 s.push(x); 7 if(t.empty()){ 8 t.push(x); 9 }10 else{11 int temp=t.top();12 if(x<temp)13 t.push(x);14 else15 t.push(temp);16 }17 }18 19 void pop() {20 t.pop();21 s.pop();22 }23 24 int top() {25 return s.top();26 }27 28 int getMin() {29 30 int temp= t.top();31 return temp;32 }33 };
相应的,节省空间的代码是:
1 class MinStack { 2 public: 3 void push(int x) { 4 s.push(x); 5 if (t.empty() || t.top()>= x) t.push(x);//注意这里不能取> 否则如果有两个连续的最小值输入的话,若果弹出其中一个的话,返回的最小值可能会出错。 6 } 7 8 void pop() { 9 int top = s.top(); s.pop();10 if (top == t.top()) t.pop();11 }12 13 int top() {14 return s.top();15 }16 17 int getMin() {18 return t.top();19 }20 private:21 stack<int> s;22 stack<int> t;23 };
Min Stack (10)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。