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=0){ 6 this->value=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 else 15 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 };
时间: 2024-10-10 11:16:46