数据结构C语言学习D7


前言

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。


提示:以下是本篇文章正文内容,下面案例仅供参考

一、栈是什么?

栈(stack)又名堆栈,它是一种运算受限的线性表。或者说是特殊的(顺序表、单链表)链表

二、顺序表栈实现

1.创建一个Stack的struct数据类型

代码如下(示例):

typedef int MY_DATA;

// this is sequence list stack templant
typedef struct{
  MY_DATA *data;
  int length;
  int top;
}sqslink;

2.创建

代码如下(示例):

sqslink * initStack(int length){
    sqslink *s;
    if((s = (sqslink *)malloc(sizeof(sqslink))) == NULL){
        printf("stack malloc failed!\n");
        return NULL;
    }

    if((s->data = (MY_DATA *)malloc(length * sizeof(MY_DATA)))== NULL){
        printf("stack data malloc failed!\n");
        free(s);
        return NULL;
    }

    memset(s->data, 0, length*sizeof(MY_DATA)); // initialization data
    s->length = length;
    s->top = -1;
    return s;
}


3. 相关操作 push / pop / free

代码如下(示例)

// @ pop stack
MY_DATA popStack(sqslink *s){
    s->top--;
    return (s->data[s->top+1]);
}
// @ view top
MY_DATA topStack(sqslink *s){
    return (s->data[s->top]);
}
// @ check whether is empty
int emptyStack(sqslink *s){
    if(!s){
        printf("stack NULL\n");
        return -1;
    }
    return (s->top == -1 ? 1 : 0);
}
// @ check whether is full
int fullStack(sqslink *s){
    if(!s){
        printf("stack NULL\n");
    }
    return (s->top == s->length-1 ? 1 : 0);
}
// clear empty stack
int clearStack(sqslink *s){
    if(!s){
        printf("stack NULL\n");
        return -1;
    }

    s->top = -1;

    return 0;
}
// @ free malloc
int freeStack(sqslink *s){
    if(!s){
        printf("stack NULL\n");
    }

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

三、单链表栈实现

1.创建一个Stack的struct数据类型

typedef int MY_DATA;

// create single linked list stack node template
typedef struct Link{
  MY_DATA elem;
  struct Link *next;
}link, *LinkStack;

2.操作

// @ initialization stack node
LinkStack initStack(){
    LinkStack s;
    if((s = (LinkStack)malloc(sizeof(link))) == NULL){
        printf("malloc faild!!\n");
        return NULL;
    }
    s->elem = 0;
    s->next = NULL;

    return s;
}
// @ push stack
int pushStack(LinkStack s, MY_DATA elem){
    LinkStack t;
    if(!s){
        printf("your s is NULL!\n");
        return -1;
    }

    if((t = (LinkStack)malloc(sizeof(link))) == NULL){
        printf("malloc failed!!!\n");
        return -1;
    }
    t->elem = elem;
    //t->next = NULL;
    t->next = s->next;
    s->next = t;

    return 0;
}
// @ pop stack
MY_DATA popStack(LinkStack s){
    LinkStack t;
    MY_DATA a;
    
    t = s->next; 
    s->next = t->next;

    a = t->elem;

    free(t);
    t = NULL;

    return a;
}
// @ check stack empty 
int emptyStack(LinkStack s){
    if(!s){
        printf("your \'s\' is NULL!\n");
        return -1;
    }
    return (s->next == NULL ? 1 : 0);
}
// show stack top 
MY_DATA topStack(LinkStack s){
    return (s->next->elem);
}
// free malloc
LinkStack freeStack(LinkStack s){
    LinkStack t;
    if(!s){
        printf("your \'s\' is NULL!\n");
        return NULL;
    }
    
    while(s){
        t = s;
        s = s->next;
        printf("free:%d\n",t->elem);
        free(t);
    }
    return NULL;
}

总结

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

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

另一固定端称为“栈底”

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值