[質問] P165の剣はオファーを指します:インタビューの質問30:最小関数を含むスタック(ポインターの使用は実装されていません)

インタビュー質問30:最小関数
含むスタックスタックのデータ構造を定義します。このタイプのスタックの最小要素を取得できる最小関数を実装してください。このスタックでは、min、push、およびpopの呼び出しの時間計算量はすべてO(1)です。

イノベーションポイント:MinStack構造体のポインタースタックではありません。スタックからポップアウトするときにのみポインターポイントを変更する必要がありますスタックの最上位要素をポップアップし
リンクをクリックする必要はありません:https: //leetcode-cn.com/problems/bao-han-minhan-shu -de-zhan-lcof /

typedef struct
{
    
    
    // 结构体里的是指针不是一个栈
    int* data_stack;
    int* min_stack;
    int data_index;
    int min_index;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate()
{
    
    
    MinStack* p = (MinStack*)malloc(sizeof(MinStack));
    p -> data_stack = (int*)malloc(sizeof(int) * 20000);
    p -> min_stack = (int*)malloc(sizeof(int) * 20000);
    p -> data_index = 0;
    p -> min_index = 0;
    return p;
}

int minStackTop(MinStack*);

void minStackPush(MinStack* obj, int x)
{
    
    
    (obj -> data_stack)[obj -> data_index++] = x;
    if(obj -> min_index == 0 || x < (obj -> min_stack)[obj -> min_index - 1])
        (obj -> min_stack)[obj -> min_index++] = x;
    else
        (obj -> min_stack)[obj -> min_index++] = (obj -> min_stack)[obj -> min_index - 1];
}

// 最值得学习的就是出栈只需改指针指向,无需删除值
void minStackPop(MinStack* obj)
{
    
    
    if(obj -> data_index > 0)
    {
    
    
        obj -> data_index--;
        obj -> min_index--;
    }
}

int minStackTop(MinStack* obj)
{
    
    
        return (obj -> data_stack)[obj -> data_index - 1];
}

int minStackMin(MinStack* obj)
{
    
    
        return (obj -> min_stack)[obj -> min_index - 1];
}

void minStackFree(MinStack* obj)
{
    
    
    free(obj -> data_stack);
    free(obj -> min_stack);
    free(obj);
}

/*
 * 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);
*/

おすすめ

転載: blog.csdn.net/m0_46613023/article/details/115005626