数据结构与算法(栈)

目录

栈的原理

栈的应用

顺序栈的定义

创建栈

入栈

判断空

判断满

出栈

栈顶元素

删除栈

清空栈

链式栈的定义

 创建栈

入栈

出栈

判断空

栈顶元素

删除栈

输出栈元素


栈的原理

栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)

允许进行操作的一端称为“栈顶”

另一固定端称为“栈底”

当栈中没有元素时称为“空栈”。特点 :后进先出(LIFO)。

栈的应用

顺序栈的定义

它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top(相对指针)完成各种操作。

typedef  int  data_t ; /*定义栈中数据元素的数据类型*/
typedef struct 
{	
       data_t  *data ; 	/*用指针指向栈的存储空间*/
       int  maxlen;	/*当前栈的最大元素个数*/
       int  top ; 	/*指示栈顶位置(数组下标)的变量*/
  } sqstack, *stacklink; 		/*顺序栈类型定义*/

创建栈

stacklink stack_creat(int len){
        stacklink s;
        //判断栈申请成功
        if((s=(stacklink)malloc(sizeof(stacklink)))==NULL){
                printf("malloc stack_create failed\n");
                return NULL;
        }   
        //判断数据空间申请成功
        if((s->data = (data_t *)malloc(len * sizeof(stacklink)))==NULL){
                printf("malloc data failed\n");
                free(s);
                return NULL;
        }   
        //初始化,用户来输入申请多少空间
        memset(s->data,0,len*sizeof(data_t));
        s->maxlen = len;
        s->top = -1; 
        return s;
}

入栈

int stack_push(stacklink s,data_t value){
        if(s == NULL){
                printf("stack is null\n");
                return -1; 
        }   
        if(s->top == s->maxlen-1){
                printf("stack is full\n");
                return -1; 
        }
        //top是下标,入栈成功需要+1
        s->top++;
        s->data[s->top] = value;

        return 0;
}

判断空

int stack_empty(stacklink s){

        if(s == NULL){
                printf("stack is null\n");
                return -1;
        }

        return ((s->top==-1)?1:0);

}

判断满

int stack_full(stacklink s){

        if(s == NULL){
                printf("stack is null\n");
                return -1;
        }

        return(s->top==s->maxlen-1?1:0);
}

出栈

data_t stack_pop(stacklink s){
        s->top--;//data[top]本身的元素还在,但是逻辑上已经不在栈里面了
        return (s->data[s->top+1]);
}

栈顶元素

data_t stack_top(stacklink s){

        return (s->data[s->top]);
}

删除栈

int stack_free(stacklink s){

        if(s == NULL){

                printf("s is NULL\n");
                return -1;
        }

        if(s->data!=NULL){
                free(s->data);
        }
        free(s);

        return 0;
}

清空栈

int stack_clear(stacklink s){                        
                                                     
        if(s == NULL){   
                printf("s is NULL\n");               
                return -1;                           
        }                                            
        s->top = -1;
        return 0;
}

链式栈的定义

插入操作和删除操作均在链表头部进行,链表尾部就是栈底,栈顶指针就是头指针。

typedef  int  data_t ;	 /*定义栈中数据元素数据类型*/
typedef  struct  node_t {
    data_t data ;		   /*数据域*/
	struct  node_t  *next ;   /*链接指针域*/
}  linkstack_t,*linkstack;		  /*链栈类型定义*/

 创建栈

linkstack stack_create(){
        linkstack s;
        s = (linkstack)malloc(sizeof(linknode));
        if(NULL == s){
                printf("malloc create failed\n");
                return NULL;
        }
        s->data = 0;
        s->next = NULL;

        return s;
}

入栈

int stack_push(linkstack s,int value){
        linkstack p;
        if(NULL == s){
                printf("s is NULL\n");
                return -1;
        }
        p = (linkstack)malloc(sizeof(linknode));
        if(p == NULL){
                printf("push malloc failed\n");
                return -1;
        }
        p->next = s->next;
        p->data = value;
        s->next = p;

        return 0;
}

出栈

data_t stack_pop(linkstack s){
        linkstack p;
        data_t t;
        p = s->next;
        s->next = p->next;
        t = p->data;
        free(p);
        p = NULL;
        return t;
}

判断空

int stack_empty(linkstack s){
        if(s == NULL){
                printf("s is NULL\n");
                return -1;
        }
        return (s->next == NULL?1:0);
}

栈顶元素

data_t stack_top(linkstack s){

        if(s == NULL){
                printf("s is NULL\n");
                return -1;
        }
        return(s->next->data);
}

删除栈

linkstack stack_free(linkstack s){

        if(s == NULL){
                printf("s is NULL\n");
                return NULL;
        }
        linkstack p;
        p = s;
        while(s){
                s = s->next;
                printf("free:%d\n",p->data);
                free(p);
                p = s;
        }
        p = NULL;
        return  NULL;

}

输出栈元素

linkstack stack_show(linkstack s){
        linkstack p;
        p = s->next;
        while(p!=NULL){
                printf("%d\n",p->data);
                p = p->next;
        }

        return s;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值