디자인 된 min, push 와 pop 의 시간 복잡 도 는 모두 O (1) 이다.

제목: 스 택 의 데이터 구 조 를 정의 합 니 다. min 함 수 를 추가 하여 스 택 의 최소 요 소 를 얻 을 수 있 도록 해 야 합 니 다.요구 함수 min, push 및 pop 의 시간 복잡 도 는 모두 O (1) 입 니 다.
\brief     min    

        ,      min  ,          。

    min、push  pop        O(1)。

            ,     ,       min   。

*/

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

 

#define SUCCESS 0                   ///<     

#define FAILED -1                   ///<     

 

typedef struct _MinStackItem        ///     

{

    int data;                       ///<    

    struct _MinStackItem *next;     ///<         

} MinStackItem;

 

typedef struct _MinStack            ///   

{

    MinStackItem *top;              ///<     

    MinStackItem *min;              ///<        

} MinStack;

 

 

/*!

   

\param pStack       

\return        SUCCESS;    FAILED

*/

int create_stack(MinStack **pStack)

{

    int retVal = FAILED;

 

    if(pStack)

    {

        MinStack *newStack = malloc(sizeof(MinStack));

 

        if(newStack)

        {

            newStack->top = NULL;

            newStack->min = NULL;

 

            *pStack = newStack;

 

            retVal = SUCCESS;

        }

    }

 

    return retVal;

}

 

/*!

   stack    

\param stack    

\return      NULL       ;     

*/

int stack_isEmpty(const MinStack *stack)

{

    return !stack || (stack && stack->top == NULL);

}

 

/*!

     data   stack,     O(1)

\param stack    

\param data        

\return       SUCCESS;    FAILED

*/

int stack_push(MinStack *stack, int data)

{

    int retVal = FAILED;

 

    if(stack)

    {

        MinStackItem *item = malloc(sizeof(MinStackItem));  //      

        MinStackItem *min = malloc(sizeof(MinStackItem));   //       

 

        if(item && min)

        {

            item->data = data;

            min->data = data;

 

            if(stack->top && stack->min)

            {

                if(data < stack->top->data)

                    min->data = data;

                else

                    min->data = stack->min->data;

            }

 

            /*   item   stack->top */

            item->next = stack->top;

            stack->top = item;

 

            /*   min   stack->min */

            min->next = stack->min;

            stack->min = min;

 

            retVal = SUCCESS;

        }

    }

 

    return retVal;

}

 

/*!

  stack        data     ,     O(1)

\param stack    

\param data         

\return       SUCCESS;    FAILED

*/

int stack_pop(MinStack *stack, int *data)

{

    int retVal = FAILED;

 

    if(stack && data)

    {

        MinStackItem *freePtr = NULL;

 

        /*     top min,   NULL,     NULL */

        assert((stack->top && stack->min) || (!stack->top && !stack->min));

 

        if(stack->top && stack->min)

        {

            *data = stack->top->data;       //      

 

            freePtr = stack->top;           //    ->freePtr

            stack->top = stack->top->next;  //      ,    

 

            free(freePtr);                  //free    

 

            freePtr = stack->min;           //     ->freePtr

            stack->min = stack->min->next;  //       ,     

 

            free(freePtr);                  //free     

 

            retVal = SUCCESS;

        }

    }

 

    return retVal;

}

 

/*!

     stack    ,    min     ,     O(1)

\param stack    

\param min           

\return       SUCCESS;    FAILED

*/

int stack_min(const MinStack *stack, int *min)

{

    int retVal = FAILED;

 

    if(stack && min && stack->min)

    {

        *min = stack->min->data;

 

        retVal = SUCCESS;

    }

 

    return retVal;

}

 

/*!

   ,      NULL

\param pStack       

*/

void delete_stack(MinStack **pStack)

{

    if(pStack)

    {

        MinStack *stack = *pStack;

        MinStackItem *freePtr = NULL;

 

        if(stack)

        {

            /*   top  */

            while(stack->top)

            {

                freePtr = stack->top;

                stack->top = stack->top->next;

 

                free(freePtr);

            }

 

            /*   min  */

            while(stack->min)

            {

                freePtr = stack->min;

                stack->min = stack->min->next;

 

                free(freePtr);

            }

        }

 

        *pStack = NULL;

    }

}

 

int main()

{

    int result = FAILED;

 

    int dataSet[] = {10, 4, 2, 3, 1, 5};    //     

    MinStack *stack = NULL;                 // 

 

    /*     */

    result = create_stack(&stack);

 

    /* push     */

    {

        int i;

 

        for(i = 0; i < sizeof(dataSet) / sizeof(int) && result == SUCCESS; ++ i)

        {

            result = stack_push(stack, dataSet[i]);

            printf("push: %d %s
", dataSet[i], result == SUCCESS ? "success!" : "failed!"); } } /* pop */ while(result == SUCCESS && !stack_isEmpty(stack)) { int data = -1, min = -1; if(stack_min(stack, &min) == SUCCESS && stack_pop(stack, &data) == SUCCESS) printf("current min: %d, pop: %d success!
", min, data); else result = FAILED; } /* */ delete_stack(&stack); assert(!stack); return result; }

좋은 웹페이지 즐겨찾기