/**
*
*整体思路:
*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);
*/