题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
思路:这题的难点在于维护最小值。我们可以定义一个结构体,保存当前的值,并且保存到目前为止的最小值,这样,删除操作后,它的最小值的查询操作就是O(1)。这也是空间换时间的例子。
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef struct Node{
int val;
int min;
Node() {}
Node(int val, int min) : val(val), min(min) {}
Node(int va) : val(va), min(va) {}
}*pNode;
class Stack{
private:
pNode stack;
int capacity;
int size;
void Stack_Resize(int);
public:
void Remove_all();
bool Get_min(int &);
void Push(int);
bool Pop();
Stack();
~Stack();
};
void Stack::Remove_all(){
size = 0;
Stack_Resize(10);
}
void Stack::Stack_Resize(int cap){
this->capacity = cap;
stack = (pNode)realloc(stack, sizeof(Node) * this->capacity);
}
bool Stack::Get_min(int &x){
if(size == 0)
return false;
x = stack[size-1].min;
return true;
}
bool Stack::Pop(){
if(size == 0)
return false;
size--;
return true;
}
void Stack::Push(int x){
if(size == capacity)
Stack_Resize(this->capacity * 2);
if(size == 0){
stack[size] = *(new Node(x));
}
else{
int min = x < stack[size-1].min ? x : stack[size-1].min;
stack[size] = *(new Node(x, min));
}
size++;
}
Stack::Stack(){
size = 0;
this->capacity = 10;
stack = (pNode)malloc(this->capacity * sizeof(Node));
}
Stack::~Stack(){
}
int main()
{
int n;
char str[10];
Stack *stack = new Stack();
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; i++){
scanf("%s", str);
if(str[0] == 's'){
int x;
scanf("%d", &x);
stack->Push(x);
if(stack->Get_min(x))
printf("%d\n", x);
else
printf("NULL\n");
}
else{
int x;
stack->Pop();
if(stack->Get_min(x))
printf("%d\n", x);
else
printf("NULL\n");
}
}
stack->Remove_all();
}
delete stack;
return 0;
}