栈:是一种特殊的线性存储数据结构,分为顺序栈和链式栈,其特点是“先进后出”,类似于箱子。栈底元素保持不变,对栈中元素的删除(出栈)和插入(压栈)操作只能在栈顶进行操作。
栈的结构定义:
typedef struct
{
int base ;//base始终是指向栈底
int top ; //top指向栈顶元素的上一个位置
int data[ MAXIZE ] ; //定义栈
} Stack ;
初始化栈:
void init_stack( Stack * S )
{
S->base = S->top = 0 ;
}
判断栈是否已满:
int full_stack( Stack * S )
{
if( S->top == MAXIZE - 1 )
return OK ;
else
return ERROR ;
}
判断栈是否为空:
int empty_stack( Stack * S )
{
if( S->base == S->top )
return OK ;
else
return ERROR ;
}
压栈操作:
int push_stack( Stack * S , int val )
{
if( full_stack( S ) )
return ERROR ;//栈满就不能进行压栈操作
else
{
S->data[ S->top++ ] = val ;
return OK ;
}
}
出栈操作:
int pop_stack( Stack * S , int * val )
{
if( empty_stack( S ) ) //栈空不能进行出栈操作
return ERROR ;
else
{
*val = S->data[ --S->top ] ;
return OK ;
}
}
遍历栈:
int traverse_stack( Stack * S )
{
if( empty_stack( S ) )
return ERROR ;
else
{
//这里遍历栈的时候千万不能直接对top进行操作
//如:while( --S->top= 0 ) printf( "%d " , S->data[ S->top ]),这样子就会改变了原来的栈,因此就要引入计数器i
for( int i = S->top - 1 ; i >= 0 ; i-- )
printf( "%d " , S->data[ i ] ) ;
printf( "\n" ) ;
return OK ;
}
}
取栈顶元素:
int gettop( Stack * S , int * val )
{
if( empty_stack( S ) )
return ERROR ;
else
{
int i = S->top - 1 ;
*val = S->data[ i ] ;
return OK ;
}
}
清空栈:
int clear_stack( Stack * S )
{
S->top = S->base ;
return OK ;
}
附上源代码:
#include
#include
#define MAXIZE 100
#define ERROR 0
#define OK 1
typedef struct
{
int base ;
int top ;
int data[ MAXIZE ] ;
} Stack ;
void init_stack( Stack * S ) ;
int empty_stack( Stack * S ) ;
int full_stack( Stack * S ) ;
int push_stack( Stack * S , int val ) ;
int pop_stack( Stack * S , int * val ) ;
int traverse_stack( Stack * S ) ;
int clear_stack( Stack * S ) ;
int gettop( Stack * S , int * val ) ;
int main( void )
{
Stack S ;
int val ;
init_stack( &S ) ;
push_stack( &S , 2 ) ;
push_stack( &S , 3 ) ;
push_stack( &S , 4 ) ;
push_stack( &S , 5 ) ;
push_stack( &S , 6 ) ;
traverse_stack( &S ) ;
pop_stack( &S , &val ) ;
printf( "出栈元素是 %d\n" , val ) ;
traverse_stack( &S ) ;
gettop( &S , &val ) ;
printf( "栈顶元素是 %d\n" , val ) ;
return 0 ;
}
void init_stack( Stack * S )
{
S->base = S->top = 0 ;
}
int empty_stack( Stack * S )
{
if( S->base == S->top )
return OK ;
else
return ERROR ;
}
int full_stack( Stack * S )
{
if( S->top == MAXIZE - 1 )
return OK ;
else
return ERROR ;
}
int push_stack( Stack * S , int val )
{
if( full_stack( S ) )
return ERROR ;
else
{
S->data[ S->top++ ] = val ;
return OK ;
}
}
int pop_stack( Stack * S , int * val )
{
if( empty_stack( S ) )
return ERROR ;
else
{
*val = S->data[ --S->top ] ;
return OK ;
}
}
int traverse_stack( Stack * S )
{
if( empty_stack( S ) )
return ERROR ;
else
{
for( int i = S->top - 1 ; i >= 0 ; i-- )
printf( "%d " , S->data[ i ] ) ;
printf( "\n" ) ;
return OK ;
}
}
int clear_stack( Stack * S )
{
S->top = S->base ;
return OK ;
}
int gettop( Stack * S , int * val )
{
if( empty_stack( S ) )
return ERROR ;
else
{
int i = S->top - 1 ;
*val = S->data[ i ] ;
return OK ;
}
}
|