数据结构之链栈及其相关操作(c语言实现)

栈是一种后进先出的限制性数据结构,结构理解较为简单,而链栈通过栈顶,栈底指针(栈底其实可以不用)来实现数据的修改及查询。链栈实现的关键是理解结构中指针的指向及其作用。
代码如下:(初始化栈,出栈,入栈,清空栈,获得栈顶元素,栈长,判断栈是否为空,遍历栈)

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define OVERflow -1
#define Error 0
#define OK 1

typedef struct ele//定义链栈元素结构体:包括两个部分:1.值;2.指向下一个元素的指针;
{
    int data;
    struct ele *next;
}element;

typedef struct{//定义链栈,包含一个栈顶指针和一个栈底指针;
    element *top;
    element *bottom;
}link_stack;

int init_stack(link_stack *sta)//链栈初始化;
{
    sta->bottom=(element*)malloc(sizeof(element));
    if(sta->bottom==NULL)
    {
        return OVERflow;
    }
    sta->bottom->next=NULL;
    sta->top=sta->bottom;
    return OK;
}

int push_stack(link_stack *sta,int e)//入栈;
{
    sta->top->data=e;
    element *p=(element *)malloc(sizeof(element));
    if(p==NULL)
    {
        return OVERflow;
    }
    p->next=NULL;
    sta->top->next=p;
    sta->top=p;//注意点:栈顶指针为栈顶元素的位置+1(物理意义上的+1,地址并不连续);
    return OK;
}

int pop_stack(link_stack *sta)//出栈;
{
    if(sta->top==sta->bottom)
    {
        return Error;
    }
    element *p=sta->bottom;
    while(p->next!=sta->top)
    {
        p=p->next;
    }
    element *q=sta->top;
    sta->top=p;
    sta->top->next=NULL;
    free(q);
    return OK;
}

int destroy_stack(link_stack *sta)//摧毁栈;
{
    element *p;
    element *q;
    p=sta->bottom;//从底开始清空栈;
    while(p!=NULL)
    {
        q=p->next;
        free(p);
        p=q;
    }
    sta->bottom=NULL;
    return OK;
}

int get_length(link_stack sta)//获得栈长;
{
    element *p=sta.bottom;
    int l=0;
    while(p!=sta.top)
    {
        p=p->next;
        l++;
    }
    return l;
}

void get_element(link_stack sta)//遍历栈内所有元素;
{
    element *p=sta.bottom;
    while(p!=sta.top)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

bool is_empty(link_stack sta)//判断栈是否为空;
{
    return sta.top==sta.bottom? true: false;
}

int main()
{
    link_stack sta;
    printf("初始化空栈:\n");
    init_stack(&sta);
    printf("栈是否为空?(1.是;0.否)\n");
    printf("%d\n",is_empty(sta));
    printf("栈内元素数:\n");
    printf("%d\n\n",get_length(sta));

    printf("元素1入栈:\n");
    push_stack(&sta,1);
    printf("栈是否为空?(1.是;0.否)\n");
    printf("%d\n",is_empty(sta));
    printf("栈内元素为:\n");
    get_element(sta);
    printf("栈内元素数:\n");
    printf("%d\n\n",get_length(sta));

    printf("元素2入栈:\n");
    push_stack(&sta,2);
    printf("栈是否为空?(1.是;0.否)\n");
    printf("%d\n",is_empty(sta));
    printf("栈内元素为:\n");
    get_element(sta);
    printf("栈内元素数:\n");
    printf("%d\n\n",get_length(sta));

    printf("元素3入栈:\n");
    push_stack(&sta,3);
    printf("栈是否为空?(1.是;0.否)\n");
    printf("%d\n",is_empty(sta));
    printf("栈内元素为:\n");
    get_element(sta);
    printf("栈内元素数:\n");
    printf("%d\n\n",get_length(sta));

    printf("栈顶元素出栈:\n");
    pop_stack(&sta);
    printf("栈是否为空?(1.是;0.否)\n");
    printf("%d\n",is_empty(sta));
    printf("栈内元素为:\n");
    get_element(sta);
    printf("栈内元素数:\n");
    printf("%d\n\n",get_length(sta));

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值