栈是只允许从栈顶压入数据,从栈顶弹出数据,所以栈是先进后出(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) ;
}