【数据结构】栈

【1】栈的概念

栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈),
允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中
没有元素时称为“空栈”。

【2】特点 ##

后进先出(LIFO)。 

【3】顺序栈(sqstack)

定义数据类型
定义结构体  top = 0, top = -1
创建一个空的栈
判断栈是否为空
判断栈是否为满
入栈(压栈)
出栈(弹栈)
打印栈的数据

【4】链式栈(linkstack)

定义数据类型
定义结构体
创建一个空的栈
判断栈是否为空
入栈(压栈)
出栈(弹栈)
打印栈的数据

【5】代码

/*顺序栈*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define START 1  
typedef int datatype_t;

struct sqstack
{
    datatype_t data[MAX];
    int top;
};

struct sqstack * sqstack_create()
{
    struct sqstack *tmp=(struct sqstack *)malloc(sizeof(struct sqstack));
#if START
    tmp->top=-1;
#else
    tmp->top=0;
#endif
    return tmp;
}

int sqstack_isempty(struct sqstack *ss)
{
#if START
    return (ss->top==-1)?1:0;
#else
    return (ss->top==0)?1:0;
#endif
}

int sqstack_isfull(struct sqstack *ss)
{
#if START
    return (ss->top==MAX-1)?1:0;
#else
    return (ss->top==MAX)?1:0;
#endif
}

void sqstack_push(struct sqstack *ss,datatype_t value)
{
    if(sqstack_isfull(ss))
    {
        printf("full\n");
        return;
    }
#if START
    ss->data[++(ss->top)]=value;
#else
    ss->data[(ss->top)++]=value;
#endif
}

datatype_t sqstack_pop(struct sqstack *ss)
{
    if(sqstack_isempty(ss))
    {
        printf("empty\n");
        return -1;
    }
#if START
    return ss->data[(ss->top)--];
#else
    return ss->data[--(ss->top)];
#endif
}

void sqstack_print(struct sqstack *ss)
{
    int i;
    for(i=0;i<=ss->top;i++)
    {
        printf("%d ",ss->data[i]);
    }
    putchar(10);
}


int main()
{
    struct sqstack *ss=sqstack_create();

    int i;
    for(i=0;i<5;i++)
    {
        sqstack_push(ss,i);
    }
    //sqstack_print(ss);
    while(sqstack_isempty(ss)==0)
        printf("%d ",sqstack_pop(ss));
    putchar(10);
    free(ss);
    return 0;
}
/*           链式栈           */
#include <stdio.h>
#include <stdlib.h>
typedef int datatype_t;

struct node
{
    datatype_t data;
    struct node *next;
};

struct node *linkstack_create()
{
    struct node *tmp=(struct node *)malloc(sizeof(struct node));
    tmp->next=NULL;
    return tmp;
}

int linkstack_isempty(struct node *ls)
{
    return (ls->next==NULL)?1:0;
}

void linkstack_push(struct node *ls,datatype_t value)
{
    struct node *tmp=(struct node *)malloc(sizeof(struct node));
    tmp->data=value;
    tmp->next=ls->next;
    ls->next=tmp;
}

datatype_t linkstack_pop(struct node *ls)
{
    if(linkstack_isempty(ls)==1)
    {
        printf("empty");
        return -1;
    }
    struct node *p=ls->next;
    ls->next=p->next;
    datatype_t tmp=p->data;
    free(p);
    return tmp;

}


int main()
{
    int i;
    struct node *linkstack;
    linkstack=linkstack_create();

    for(i=0;i<5;i++)
        linkstack_push(linkstack,i);

    while(linkstack_isempty(linkstack)==0)
    {
        printf("%d ",linkstack_pop(linkstack));
    }
    putchar(10);
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值