基本数据结构——栈

    栈(STACK)又称为堆栈,是一种“特殊”的线性表,这种线性表的插入和删除运算只允许在表的一端进行。允许进行插入和删除运算的这一端称为栈顶(TOP),不允许进行插入和删除运算的另一端则称为栈底(BOTTOM);向栈中插入一个新元素称为入栈,从栈中删除一个元素称为出栈;
    由于栈的插入和删除运算仅在栈顶一端进行,所以栈是一种先进后出的结构(FRIST IN LAST OUT),栈的存储结构主要分两种:栈的顺序存储结构和链接存储结构。
    顺序栈:
#include <stdio.h>
#include <stdlib.h>

typedef int data_t;
typedef struct seqstack{
    data_t *data;
    int top;
    int maxlen;
}seqstack_t;

//创建一个指定大小的顺序栈
//1. 在内存中开辟顺序栈的空间
//2.在内存中开辟顺序栈的数据存储空间并
//将数据存储空间的首地址赋值给顺序栈的data成员
//3. 对其他成员进行初次赋值操作
//4. 返回创建并设置好的顺序栈的首地址
seqstack_t *Create_seqstack(int length)
{
    seqstack_t *ss = (seqstack_t *)malloc(sizeof(seqstack_t));
    ss->data = (data_t *)malloc(sizeof(data_t) * length);
    ss->top = -1;
    ss->maxlen = length;

    return ss;
}
//判断顺序栈是否为空
int judge_emtry_seqstack(seqstack_t *ss)
{
    if(ss == NULL)
    {
        printf("stack is NULL\n");
        return -1;
    }
    return ss->top == -1;
}
//判断是否是满栈
int judge_full_seqstack(seqstack_t *ss)
{
    return ss->top + 1 == ss->maxlen;
}
//入栈
//1. 先让top向后移动
//2. 将要入栈的数据保存到当前top下标所代表的存储空间ss->data[ss->top] = *data
int push_seqstack(seqstack_t *ss , data_t *data)
{
    if(judge_full_seqstack(ss))
    {
        printf("seqstack is full\n");
        return -1;
    }

    ss->top++;
    ss->data[ss->top] = *data;

    return 0;
}
//获得栈顶元素
int gettop_seqstack(seqstack_t *ss , data_t *data)
{
    if(judge_emtry_seqstack(ss))
    {
        printf("seqstack is NULL\n");
        return -1;
    }

    *data = ss->data[ss->top];

    return 0;
}
//根据元素位置获得元素数据
int get_index_seqstack(seqstack_t *ss , int index , data_t *data)
{
    if(judge_emtry_seqstack(ss))
    {
        printf("seqstack is NULL\n");
        return -1;
    }

    if(index > ss->top)
    {
        printf("index over stack address\n");
        return -1;
    }

    *data = ss->data[index-1];
    return 0;
}
//遍历顺序栈
int tarverse_seqstack(seqstack_t *ss)
{
    if(judge_emtry_seqstack(ss))
    {
        printf("seqstack is NULL\n");
        return -1;
    }
    int count = 0;
    while(count <= ss->top)
    {
        printf(" %d element stack :%d\n", count , ss->data[count]);
        count ++;
    }

    return 0;
}
//出栈
int pop_seqstack(seqstack_t *ss)
{
    if(judge_emtry_seqstack(ss))
    {
        printf("seqstack is NULL\n");
        return -1;
    }

    ss->top--;
    return 0;
}
//清空栈
int clear_seqstack(seqstack_t *ss)
{
    ss->top = -1;

    return 0;
}
//销毁顺序栈
//1. 释放顺序栈数据的存储空间
//2. 释放顺序表的空间
int destory_seqstack(seqstack_t *ss)
{
    free(ss->data);
    free(ss);

    return 0;
}

int main()
{
    seqstack_t *ss;
    ss = Create_seqstack(30);
    data_t data;
    if(judge_emtry_seqstack(ss))
    {
        printf("seqstack is NULL\n");
    }
    else
    {
        printf("seqstack is data\n");
    }

    data = 100; push_seqstack(ss , &data);
    data = 200; push_seqstack(ss , &data);
    data = 300; push_seqstack(ss , &data);
    data = 4000; push_seqstack(ss , &data);
    data = 5000; push_seqstack(ss , &data);
    data = 6000; push_seqstack(ss , &data);
    data = 70000; push_seqstack(ss , &data);
    data = 80000; push_seqstack(ss , &data);
    data = 90000; push_seqstack(ss , &data);

    gettop_seqstack(ss , &data);
    printf("top stack is :%d\n",data);
    get_index_seqstack(ss , 1 , &data);
    printf("element stack :%d\n" , data);

    tarverse_seqstack(ss);

    pop_seqstack(ss);
    tarverse_seqstack(ss);


    clear_seqstack(ss);
    tarverse_seqstack(ss);

    destory_seqstack(ss);
    tarverse_seqstack(ss);

    return 0;
}




链式栈:

include

include


以上代码为链表的基本操作,如有不对,敬请指正!!!











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值