C语言实现顺序栈

是一种特殊的线性表,我们只能对栈 的固定的一端进行插入和删除元素操作。这固定的一端被称之为栈顶,另外一端就叫做栈底。如果一个栈中没有任何元素就将其称为空栈。
特性:先进后出(后进先出)
这里写图片描述
seqstack.h文件

#pragma once

#include<stddef.h>

typedef char seqStackType;

typedef struct seqStack
{
    seqStackType *data;
    size_t size;
    //表示data段内存中能容纳的元素个数
    size_t capacity;
}seqStack;

seqStack stack;

//初始化函数
void seqStackInit(seqStack *stack);
//销毁函数
void seqStackDestroy(seqStack *stack);
//入栈函数
void seqStackPush(seqStack *stack,seqStackType value);
//出栈函数
void seqStackPop(seqStack *stack);
//取栈顶元素函数
int seqStackGetTop(seqStack *stack,seqStackType *value);

seqstack.c文件

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

#define Test_Header printf("\n==========%s==========\n",__FUNCTION__);

//初始化函数
void seqStackInit(seqStack *stack)
{
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    stack->size = 0;
    stack->capacity = 1000;
    stack->data = (seqStackType*)malloc(stack->capacity * sizeof(seqStackType));
}
//销毁函数
void seqStackDestroy(seqStack *stack)
{
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    free(stack->data);
    stack->data == NULL;
    stack->size = 0;
    stack->capacity = 0;
}
//栈的扩容函数
void seqStackReSize(seqStack *stack)
{
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    //栈的实际存储的元素个数小于规定的能容纳的最大数量
    if(stack->size < stack->capacity)
    {
        //无需扩容,直接返回
        return;
    }
    //扩容规则由自己决定
    stack->capacity = stack->capacity * 2 + 1;
    seqStackType *new_ptr = (seqStackType*)malloc(stack->capacity * sizeof(seqStackType));
    //将原来栈的元素一一复制到新扩容的栈中
    size_t i = 0;
    for(;i < stack->size;i++)
    {
        new_ptr[i] = stack->data[i];
    }
    //释放掉旧栈
    free(stack->data);
    //将栈的数据域指向新栈的数据域
    stack->data = new_ptr;
    return;
}
//入栈函数
void seqStackPush(seqStack *stack,seqStackType value)
{
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    //每次入栈前都需要判断栈是否含有空间供我们插入元素
    if(stack->size >= stack->capacity)
    {
        //如果栈空间满了
        //则需要扩容
        seqStackReSize(stack);
    }
    //将栈的最后一个元素设置为需要入栈的元素值
    //将有效元素个数+1
    stack->data[stack->size++] = value;
}
//出栈函数
void seqStackPop(seqStack *stack)
{
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    if(stack->size == 0)
    {
        //空栈无法再进行出栈操作
        return;
    }
    //出栈只需要将栈的有效元素个数减1
    --stack->size;
}
//取栈顶元素函数
//失败返回0,成功返回1
int seqStackGetTop(seqStack *stack,seqStackType *value)
{
    if(stack == NULL)
    {
        //非法输入
        return 0;
    }
    if(stack->size == 0)
    {
        //空栈
        return 0;
    }
    //value为一个输出型参数
    //栈顶元素为最后一个入栈的元素
    *value = stack->data[stack->size-1];
    return 1;
}
//打印函数
void Print(seqStack *stack,const char *msg)
{
    printf("[%s]\n",msg);
    if(stack == NULL)
    {
        //非法输入
        return;
    }
    if(stack->size == 0)
    {
        //空栈
        printf("\n");
        return;
    }
    size_t i = 0;
    for(;i < stack->size;i++)
    {
        printf("%c ",stack->data[i]);
    }
    printf("\n\n");
}

void TestStack()
{
    Test_Header;
    //测试初始化
    seqStackInit(&stack);
    printf("expected:size = 0,capacity = 1000\nactual:size = %lu,capacity = %lu\n\n",stack.size,stack.capacity);
    //测试入栈操作
    seqStackPush(&stack,'a');
    seqStackPush(&stack,'b');
    seqStackPush(&stack,'c');
    seqStackPush(&stack,'d');
    Print(&stack,"入栈4个元素");
    seqStackPop(&stack);
    seqStackPop(&stack);
    //测试出栈操作
    Print(&stack,"出栈2个元素");
    seqStackPop(&stack);
    seqStackPop(&stack);
    Print(&stack,"再出栈2个元素");
    seqStackPop(&stack);
    Print(&stack,"尝试对空栈进行出栈操作");
    seqStackPush(&stack,'a');
    seqStackPush(&stack,'b');
    //测试取栈顶元素函数
    Print(&stack,"入栈2个元素");
    seqStackType value;
    int ret = seqStackGetTop(&stack,&value);
    printf("\nexpected:1 b\nactual:%d %c\n\n",ret,value);
    //测试销毁函数
    seqStackDestroy(&stack);
    printf("expected:size = 0,capacity = 0\nactual:size = %lu,capacity = %lu\n\n",stack->size,stack->capacity);
}
//主函数调用测试函数
int main()
{
    TestStack();
    return 0;
}

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

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值