作业-day-240418

1、思维导图

2、顺序栈

seq_stack.h头文件代码:

#ifndef __SEQ_STACK_H__
#define __SEQ_STACK_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 9
typedef int datatype;
typedef struct
{
        datatype data[MAX];
        int top;
}seq_stack,*seq_p;

//创建顺序栈表
//申请空间判空
//头栈data和top初始化
seq_p create_stack();

//判空
int empty_stack(seq_p S);

//判满
int full_stack(seq_p S);

//入栈/压栈
void push_stack(seq_p S,datatype data);

//出栈/弹栈
void pop_stack(seq_p S);

//输出,输出顺序和栈操作的顺序一致
void show_stack(seq_p S);

//清空栈表
void clear_stack(seq_p S);

//释放栈表
void free_stack(seq_p *S);

#endif

seq_stack.c自定义函数代码:

//创建顺序栈表
//申请空间判空
//申请成功后,data和top初始化
seq_p create_stack()
{
        seq_p S=(seq_p)malloc(sizeof(seq_stack));
        if(S==NULL)
        {
                printf("空间申请失败\n");
                return NULL;
        }
        S->top=-1;//无元素时,top=-1
        return S;
}

//判空
int empty_stack(seq_p S)
{
        //入参合理性检查
        if(S==NULL)
        {
                printf("入参不合理\n");
                return -1;
        }
        return S->top==-1?1:0;
}

//判满
int full_stack(seq_p S)
{
        //入参合理性检查
        if(S==NULL)
        {
                printf("入参不合理\n");
                return -1;
        }
        return S->top==(MAX-1)?1:0;
}

//入栈/压栈
void push_stack(seq_p S,datatype data)
{
        //入参合理性检查
        if(S==NULL)
        {
                printf("入参不合理\n");
                return;
        }
        //判满
        if(full_stack(S))
        {
                printf("空间已满\n");
                return;
        }
        //先将top自增
        S->top++;
        //在将数据入栈
        S->data[S->top]=data;
}

//出栈/弹栈
void pop_stack(seq_p S)
{
        //入参合理性检查
        if(S==NULL)
        {
                printf("入参不合理\n");
                return;
        }
        //判空
        if(empty_stack(S))
        {
                printf("栈表为空\n");
                return;
        }
        printf("出栈值:%d\n",S->data[S->top]);
        S->top--;
        return;
}

//输出,输出顺序和栈操作的顺序一致
void show_stack(seq_p S)
{
        //入参合理性检查
        if(S==NULL)
        {
                printf("入参不合理\n");
                return;
        }
        //判空
        if(empty_stack(S))
        {
                printf("栈表为空\n");
                return;
        }
        for(int i=S->top;i>=0;i--)
                printf("%d ",S->data[i]);
        putchar(10);
}

//清空栈表
void clear_stack(seq_p S)
{
        //入参合理性检查
        if(S==NULL)
        {
                printf("入参不合理\n");
                return;
        }
        //判空
        if(empty_stack(S))
        {
                printf("栈表为空\n");
                return;
        }
        S->top=-1;
}

//释放栈表
//释放栈表指针对应的地址
void free_stack(seq_p *S)
{
        //入参合理性检查
        //*S指向栈表地址
        //S为二级指针,指向*S指针地址&(*S)
        //先检查指针对应的地址是否为NULL
        //再检查指针指向的值是否为NULL
        if(S==NULL || *S==NULL)
        {
                printf("入参不合理\n");
                return;
        }
        free(*S);
        *S=NULL;
}

main.c主函数代码:

#include "seq_stack.h"

int main()
{
        seq_p S=create_stack();
        printf("判空结果:%d\n",empty_stack(S));
        push_stack(S,10);
        push_stack(S,11);
        push_stack(S,12);
        show_stack(S);
        pop_stack(S);
        show_stack(S);
        free_stack(&S);
        printf("%p\n",S);

        return 0;
}

运行结果:

3、链栈

link_stack.h头文件代码:

#include <stdlib.h>
#include <string.h>
//定义结构体
typedef struct node
{
        int data;
        struct node *next;
}node,*node_p;

//判空
int empty_stack(node_p T);

//创栈结点,申请空间
node_p create_node(int data);

//入栈
void push_stack(node_p *T,int data);

//出栈
void pop_stack(node_p *T);

//输出栈
void show_stack(node_p T);

#endif

link_stack.c自定义函数代码:

#include "link_stack.h"

//创建栈结点,申请空间
node_p create_node(int data)
{
        node_p new=(node_p)malloc(sizeof(node));
        if(new==NULL)
        {
                printf("空间申请失败\n");
                return NULL;
        }
        new->data=data;
        return new;

}
//判空
int empty_stack(node_p T)
{
        //不再需要,入参的判空
        //因为T就在栈区

        return T==NULL?1:0;
}


//入栈
void push_stack(node_p *T,int data)
{
        node_p new=create_node(data);
        new->next=*T;//让新结点指向原来的栈顶元素
        *T=new;  //让栈底指针指向新结点
}

//出栈
void pop_stack(node_p *T)
{
        //判空
        if(empty_stack(*T))
        {
                printf("栈链表为空\n");
                return;
        }
        //保存要出栈的结点
        node_p pop=*T;
        printf("出栈的值为%d\n",pop->data);
        *T=(*T)->next;
        free(pop);
        return;
}

//输出栈
void show_stack(node_p T)
{
        //判空
        if(empty_stack(T))
        {
                printf("栈链表为空\n");
                return;
        }
        node_p p=T;
        while(p!=NULL)
        {
                printf("%d->",p->data);
                p=p->next;
        }
        printf("NULL\n");
}

main.c主函数代码:

#include "link_stack.h"

int main()
{
        //申请栈顶指针
        node_p T=NULL; //此时栈中没有数据
        push_stack(&T,11);
        push_stack(&T,12);
        push_stack(&T,13);
        push_stack(&T,14);
        push_stack(&T,15);
        show_stack(T);
        pop_stack(&T);
        show_stack(T);
        return 0;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值