第二十节 数据结构之栈


栈是只允许从栈顶压入数据,从栈顶弹出数据,所以栈是先进后出(FILO)。栈的操作有:栈的初始化、压栈、出栈、判断是否栈空、判断是否栈满、取栈顶元素。
建立一个栈,然后将栈初始化为空。
/*************************************************************************
** 函数名称   Stack_SetNull
** 函数功能   构造一个空栈函数
** 入口参数   stk
** 出口参数   void
**************************************************************************/
void Stack_SetNull( stack *stk )
{
         stk->uiTop = 0 ;
}


判断栈是否为空,只需要判断 uiTop是否为 0
/*************************************************************************
** 函数名称   StackIsEmpty
** 函数功能   判断栈是否为空函数
** 入口参数   stk
** 出口参数   ( (bool)(stk->uiTop == 0))
**************************************************************************/
bool  StackIsEmpty( stack *stk)
{
         return  ( (bool)(stk->uiTop == 0)) ;
}


判断栈是否为满,只需要判断 uiTop是否大于等于 MaxSize
/*************************************************************************
** 函数名称   StackIsFull
** 函数功能   判断栈是否满函数
** 入口参数   stk
** 出口参数   ((bool)(stk->uiTop >= MaxSize))
**************************************************************************/
bool StackIsFull( const stack *stk )
{
         return  ((bool)(stk->uiTop >= MaxSize)) ;
}


首先要判断没有栈满,先将待入栈元素压入栈顶,栈顶值加 1
/*************************************************************************
** 函数名称   PushStack
** 函数功能   入栈操作函数
** 入口参数   stk  x
** 出口参数   
**************************************************************************/
void PushStack( stack *stk , stackElementT x )
{
         assert(!StackIsFull(stk)) ;                 //确保栈没有满               
         stk->elements[(stk->uiTop)++] = x ;         //先将新元素x入栈,栈顶值加1
}


如果栈没有空,执行出栈操作。栈顶值减 1,弹出栈最上面元素的数据。 /*************************************************************************
** 函数名称   PopStack
** 函数功能   出栈操作函数
** 入口参数   stk
** 出口参数   stk->elements[--(stk->uiTop)]
**************************************************************************/
stackElementT PopStack( stack *stk )
{
         assert (!StackIsEmpty(stk)) ;               //确保栈不为空?
         return  stk->elements[--(stk->uiTop)] ;      //将栈顶值减1,相当于删除栈顶节点
                                             //返回该节点的值
}

设定一个搜索值 index,如果 index = 0 ,则是读取站最上面元素的值;如果 index = uiTop – 1,则是读取栈最底元素的值。
/*************************************************************************
** 函数名称   GetStackElement
** 函数功能   读栈任意位置元素值函数
** 入口参数   stk  index
** 出口参数   (stk->elements[stk->uiTop - index -1])
**************************************************************************/
stackElementT GetStackElement( stack *stk , int index )
{
         assert ( (index >= 0) && (index < (stk->uiTop))) ;
         return  (stk->elements[stk->uiTop - index -1]) ;
}


栈中元素个数即为 uiTop的值。
/*************************************************************************
** 函数名称   StackDepth
** 函数功能   返回栈中元素个数函数
** 入口参数   stk  index
** 出口参数   (stk->uiTop)
**************************************************************************/
int StackDepth( stack *stk )
{
         return  (stk->uiTop) ;
}

你可能感兴趣的:(c学习)