22-顺序栈的基本运算

SqStack.h文件

#ifndef SQSTACK_H
#define SQSTACK_H

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

#define MAXSIZE 100

//定义栈的顺序存储结构
typedef struct SQSTACK 
{
    void *data[MAXSIZE];  //使用数组存储,void *为通用的元素类型
    int top;              //记录栈顶元素下标
} SqStack;

//初始化栈
SqStack* Init_SqStack();

//销毁栈
void Free_SqStack(SqStack* stack);

//判断栈是否为空,为空返回0,不为空返回-1
int SqStack_IsEmpty(SqStack* stack);

//进栈
void Push_SqStack(SqStack* stack,void* data);

//出栈
void Pop_SqStack(SqStack* stack);

//取栈顶元素
void* GetTop_SqStack(SqStack* stack);

#endif



SqStack.c文件

#include "SqStack.h"


//初始化栈
SqStack* Init_SqStack()
{
    //分配顺序栈的存储空间
    SqStack *stack = (SqStack *)malloc(sizeof(SqStack));
    //初始化存储空间
    int i;
    for(i = 0; i < MAXSIZE; i++)
    {
        stack->data[i] = NULL;
    }
    //标记为栈空
    stack->top = -1;
    return stack;
}

//销毁栈
void Free_SqStack(SqStack* stack)
{
    if(stack == NULL)
    {
        return;
    }
    free(stack);
    stack = NULL;
}

//判断栈是否为空,为空返回0,不为空返回-1
int SqStack_IsEmpty(SqStack* stack)
{
    if(stack == NULL)
    {
        return -1;
    }

    //当top下标 = -1则说明栈为空
    if(stack->top == -1)
    {
        return 0;
    }
    return -1;
}

//进栈
void Push_SqStack(SqStack* stack,void* data)
{
    if(stack == NULL || data == NULL)
    {
        return;
    }

    //说明栈满了
    if(stack->top == MAXSIZE -1)
    {
        return;
    }

    //top下标+1
    stack->top++;
    //在栈顶插入元素
    stack->data[stack->top] = data;
}

//出栈
void Pop_SqStack(SqStack* stack)
{
    if(stack == NULL)
    {
        return;
    }

    //判断栈是否为空
    if(stack->top == -1)
    {
        return;
    }

    //元素出栈
    stack->data[stack->top] = NULL;
    //top下标-1
    stack->top--;
}

//取栈顶元素
void* GetTop_SqStack(SqStack* stack)
{
    if(stack == NULL)
    {
        return NULL;
    }

    if(stack->top == -1)
    {
        return NULL;
    }

    //返回栈顶元素
    return stack->data[stack->top];
}

main.c测试文件

#define _CRT_SECURE_NO_WARNINGS
#include "SqStack.h"
#include <string.h>


typedef struct STUDENT
{
    int number;    //学号
    char name[20]; //姓名
}Student;

int main(void)
{

    //创建栈
    SqStack *stack = Init_SqStack();

    //创建5个数据元素
    Student s1 = {100,"zhangsan"};
    Student s2 = {200 , "lisi"};
    Student s3 = {300, "wangwu"};
    Student s4 = {400 , "zhaoliu"};
    Student s5 = {500 , "xiaoming"};

    //将元素入栈
    printf("-----------元素入栈--------------\n\n");
    Push_SqStack(stack, (void *)&s1);
    Push_SqStack(stack, (void *)&s2);
    Push_SqStack(stack, (void *)&s3);
    Push_SqStack(stack , (void *)&s4);
    Push_SqStack(stack ,(void *)&s5);
    printf("-----------访问栈顶元素--------------\n");
    //访问栈中的元素
    while(stack->top > -1)
    {
        //访问栈顶元素
        Student *temp = (Student *)GetTop_SqStack(stack);
        printf("number = %d , name = %s\n" , temp->number , temp->name);
        //元素出栈
        Pop_SqStack(stack);
    }
    printf("--------------释放栈----------------\n");
    //释放栈
    Free_SqStack(stack);
    return 0;
}

测试结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值