【leetcode】三合一

 

/**
*
*整体思路:
*1.定义一个结构体变量TripleInOne,存储模拟栈的数组,记录每个栈的起点位置的base数组,记录每个栈指针当前位置的top数组,以及每个栈的大小size成员
*2.申请长度为1的TripleInOne型变量obj,申请长度为stacksize * 3的数组stack,申请长度为3的base和top数组,
*3.初始化 obj -> base, obj -> top和obj -> size值,设置每个栈对应的起点位置
*
*/

typedef struct {

    //simulating stack
    int * stack;
    //the starting position of each stack
    int * base;
    //the current pointer of each stack
    int * top;
    //the length of each stack
    int size;

} TripleInOne;


TripleInOne * tripleInOneCreate( int stackSize ) {

    //alloclating memory to simulating stack
    TripleInOne * obj = ( TripleInOne * )malloc( sizeof( TripleInOne ) * 1 );
    obj -> stack = ( int * )malloc( sizeof( int ) * stackSize * 3 );
    obj -> top = ( int * )malloc( sizeof( int ) * 3 );
    obj -> base = ( int * )malloc( sizeof( int ) * 3 );

    //intializing the starting position of each stack and pointer
    obj -> top[ 0 ] = obj -> base[ 0 ] = 0;
    obj -> top[ 1 ] = obj -> base[ 1 ] = stackSize;
    obj -> top[ 2 ] = obj -> base[ 2 ] = stackSize * 2;
    obj -> size = stackSize;

    return obj;

}

/**
*Function: pushing value to stack, if the stack if fulling, skipping current operation
*@param: TripleInOne * obj : the simulating stack
*@param: int stackNum : the sequence number of stack
*Rerutn: void
*/
void tripleInOnePush( TripleInOne * obj , int stackNum , int value ) {

    //checking the stack whether is fulling
    if( obj -> top[ stackNum ] < ( ( stackNum + 1 ) * obj -> size ) ) {

        obj -> stack[ obj -> top[ stackNum ] ] = value;
        obj -> top[ stackNum ] += 1;

    }

}

/**
*Function: checking whether the stack is empty
*@param: TripleInOne * obj : the simulating stack
*@param: int stackNum : the sequence number of stack
*Rerutn: true : is empty, false : is not empty
*/
bool tripleInOneIsEmpty( TripleInOne * obj , int stackNum ) {

    return ( obj -> base[ stackNum ] == obj -> top[ stackNum ] );

}

/**
*Function: popping the top element in stack
*@param: TripleInOne * obj : the simulating stack
*@param: int stackNum : the sequence number of stack
*Rerutn: int : the value of the top element in stack , -1 : the stack is empty
*/
int tripleInOnePop( TripleInOne * obj , int stackNum ) {

    if( tripleInOneIsEmpty( obj , stackNum ) ) {

        return -1;

    }

    //updating the pointer
    obj -> top[ stackNum ] -= 1;

    return obj -> stack[ obj -> top[ stackNum ] ];

}

/**
*Function: getting the value of top element in stack
*@param: TripleInOne * obj : the simulating stack
*@param: int stackNum : the sequence number of stack
*Rerutn: int : the value of the top element in stack , -1 : the stack is empty
*/
int tripleInOnePeek( TripleInOne * obj , int stackNum ) {

    if( tripleInOneIsEmpty( obj , stackNum ) ) {

        return -1;

    }

    return obj -> stack[ obj -> top[ stackNum ] - 1 ];

}

/**
*Function: freeing memory
*@param: TripleInOne * obj : the simulating stack
*Return: void
*/
void tripleInOneFree( TripleInOne * obj ) {

    free( obj -> stack );
    free( obj -> base );
    free( obj -> top );
    free( obj );

}

/**
 * Your TripleInOne struct will be instantiated and called as such:
 * TripleInOne* obj = tripleInOneCreate(stackSize);
 * tripleInOnePush(obj, stackNum, value);
 
 * int param_2 = tripleInOnePop(obj, stackNum);
 
 * int param_3 = tripleInOnePeek(obj, stackNum);
 
 * bool param_4 = tripleInOneIsEmpty(obj, stackNum);
 
 * tripleInOneFree(obj);
*/

 

posted @ 2020-08-30 18:34  温暖了寂寞  阅读(159)  评论(0编辑  收藏  举报