DPのアイデアは、ちょうどプッシュ絶えず絶えず更新され、分変数最小スタック構造の内部を維持したいが、最小ステーションポップで、値が最小でないかどうかを判断することができませんでしポップ始め、動的計画法を使用することです。思考は、唯一の変数は、少なくとも一つの配列に従事し、確かにすべての最小状態の記録ではありません。
従って最小限に最小のメモリ・アクセス・スタックを有し、最小のスタック構造、最小値値プッシュ(配列へスタックメモリ)も現在よりも小さい場合、我々はとき、最小値にスタックをプッシュします最小値は、現在のプッシュよりも大きい場合、我々は、スタックに以前の最小プッシュをコピーします。
正直なところ、あまりのコードが実際に運動の一形態であることを私のためにCのleetcodeで書かれた、チェーンスタックの実現、およびアレイスタックを練習。ダイナミック・プログラミングのために同じ時間にも理解を深めています。
コードの場合:
#define MAX_VALUES 20001
typedef struct StackNode{
int data;
struct StackNode* next;
}StackNode,*MinStackPtr;
typedef struct {
int min_stack[MAX_VALUES];
int min_stack_top;
int count;
MinStackPtr top;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack* p=malloc(sizeof(MinStack));
for(int i=0;i<MAX_VALUES;i++){
p->min_stack[i]=INT_MAX;
}
p->min_stack_top=0;
p->count=0;
p->top=NULL;
return p;
}
void minStackPush(MinStack* obj, int x) {
MinStackPtr s=malloc(sizeof(StackNode));
s->data=x;
s->next=obj->top;
obj->top=s;
obj->count++;
if(x <= obj->min_stack[obj->min_stack_top]){
obj->min_stack[++obj->min_stack_top]=x;
}
else{
obj->min_stack[obj->min_stack_top+1]=obj->min_stack[obj->min_stack_top];
obj->min_stack_top++;
}
}
void minStackPop(MinStack* obj) {
obj->min_stack_top--;
if(obj->count==0)
return;
MinStackPtr s=obj->top;
obj->top=obj->top->next;
free(s);
obj->count--;
}
int minStackTop(MinStack* obj) {
return obj->top->data;
}
int minStackMin(MinStack* obj) {
return obj->min_stack[obj->min_stack_top];
}
void minStackFree(MinStack* obj) {
MinStackPtr s=obj->top;
MinStackPtr temp;
while(s){
temp=s;
s=s->next;
free(temp);
}
obj->top=NULL;
obj->count=0;
}
/**
* Your MinStack struct will be instantiated and called as such:
* MinStack* obj = minStackCreate();
* minStackPush(obj, x);
* minStackPop(obj);
* int param_3 = minStackTop(obj);
* int param_4 = minStackMin(obj);
* minStackFree(obj);
*/