用C语言创建顺序栈并实现出栈、入栈等简单基本操作

栈:是一种特殊的线性存储数据结构,分为顺序栈和链式栈,其特点是“先进后出”,类似于箱子。栈底元素保持不变,对栈中元素的删除(出栈)和插入(压栈)操作只能在栈顶进行操作。
栈的示意图

栈的结构定义:

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<stdio.h>
#include<stdlib.h>

#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 ;
    }
}

  • 6
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值