How would you design a stack which, in addition to push and pop, also has a function
min which returns the minimum element? Push, pop and min should all operate in
O(1) time
min which returns the minimum element? Push, pop and min should all operate in
O(1) time
微软实习生一面就遇到了这个问题,当时想到的是笨办法。但是面试官一点点引导,终于想出来这么做。
#include <iostream>
using namespace std;
typedef int Data;
// Creating a Linked List:
struct Node
{
Node(Data d=0):data(d){next = NULL;};
Data data;
Node* next;
};
class Stack
{
public:
Stack():top(NULL){minNode = NULL;};
void pop()
{
if(top != NULL)
{
Node* p = top;
top = top->next;
delete p;
Node* m = minNode;
minNode = minNode->next;
delete m;
}
};
Data peek()
{
if(top != NULL)
{
return top->data;
} else {
throw "Empty Stack";
}
};
void push(Data data)
{
Node* d = new Node(data);
d->next = top;
top = d;
if(minNode != NULL && minNode->data < data)
data = minNode->data;
Node *m = new Node(data);
m->next = minNode;
minNode = m;
};
Data min()
{
if(minNode == NULL)
throw "Empty Stack";
else
return minNode->data;
};
bool isEmpty(){return top == NULL;};
private:
Node* top;
Node* minNode;
};
int main()
{
Stack stack;
stack.push(3);
cout<<stack.min()<<endl;
stack.push(2);
cout<<stack.min()<<endl;
stack.pop();
cout<<stack.min()<<endl;
system("pause");
};