原题描述:
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.
NOTE:栈中的最小元素要在O(1)时间内找到,所以可以用两个栈来实现,一个站存放所有的元素,另一个栈存放最小值,这样做空间和时间复杂度是最小的。下面是ac的代码:
class MinStack {
private:
stack<int> elements;
stack<int> mins;
public:
void push(int x) {
if (elements.empty() || mins.top() >= x) mins.push(x);
elements.push(x);
}
void pop() {
if (elements.empty()) return;
if (elements.top() == mins.top()) {
mins.pop();
}
elements.pop();
}
int top() {
return elements.top();
}
int getMin() {
return mins.top();
}
};
class MinStack {
public:
class Node {
public:
int val;
int m;
Node *next;
Node (int val, int m) {
this->val = val;
this->m = m;
next = NULL;
}
};
Node *s;
MinStack () {
s = NULL;
}
void push(int x) {
Node *n = new Node(x, x);
if (!s) {
s = n;
} else {
if (n->m > s->m) n->m = s->m;
n->next = s;
s = n;
}
}
void pop() {
if (s) {
Node *t = s;
s = s->next;
delete(t);
}
}
int top() {
return s->val;
}
int getMin() {
return s->m;
}
};
不知道用C++实现除了第一段代码有没有不超内存的方法?或者其他的思路!
另外还有一些收获:
1、C++中定义类时只能定义指向自己的指针,不能直接指向自己
2、struct和class唯一的不同是默认情况下,struct的访问权限是public,而class是private