【推荐】数据结构 【栈】:顺序表的实现

本文介绍了数据结构中栈的顺序表实现,包括入栈、出栈和取栈顶元素等基本操作。通过头文件声明,详细阐述了函数的具体实现,并提供了测试用例进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构栈的顺序表实现基本功能
1入栈

2出栈

3取栈顶元素

思想介绍:

         **栈         即先进后出
  顺序表实现采用     入栈  :尾插 
                   出栈  :尾删**

头文件

文件名 seqstack.h

#pragma once //防止头文件重复定义
#include<stdio.h>
#include<stdlib.h>

typedef char Seqstacktype;  
typedef struct Seqstack
{
    Seqstacktype* data;   //数据块指针
    size_t size;           //当前有效数据个数
    size_t capacity;       //容量
}Seqstack;

//初始化
void SeqstackInit(Seqstack* stack);

//销毁
void  SeqstackDestroy(Seqstack* stack);

//入栈
void SeqstackPush(Seqstack* stack, Seqstacktype value);

//出栈
void SeqstackPop(Seqstack* stack);

//扩容
void SeqstackAddsize(Seqstack* stack);

//取栈顶元素
Seqstacktype SeqstackGet(Seqstack* stack);

函数实现

文件名 seqstack.c

#include"seqstack.h"

//初始化  
void SeqstackInit(Seqstack* stack)
{
    if (stack == NULL)
    {
        printf("非法输入");
        return;
    }
    stack->size = 0;            
    stack->capacity = 1000;    //容量
    stack->data = (Seqstacktype*)malloc(stack->capacity*sizeof(Seqstacktype));  //分配空间
}

//销毁
void  SeqstackDestroy(Seqstack* stack)
{
    free(stack->data);  //释放指针内容
    stack->size = 0;    //有效数据清空
    stack->capacity = 0;  //容量清空
}

//扩容
void SeqstackAddsize(Seqstack* stack)
{
    if (stack == NULL)
    {
        printf("非法输入");
        return;
    }
    stack->capacity = stack->capacity * 2 + 1;  //将容量扩大
    Seqstacktype* new_ptr = (Seqstacktype*)malloc(stack->capacity*sizeof(Seqstacktype)); //申请新的空间
}


//入栈
void SeqstackPush(Seqstack* stack, Seqstacktype value)
{
    if (stack == NULL)
    {
        printf("非法输入");
        return;
    }
    if (stack->size >= stack->capacity)  //如果当前有效数据个数 >  容量
    {                                    //说明 栈已经满了 
        SeqstackAddsize(stack);          //扩容
    }
    stack->data[stack->size++] = value;   
    return;
}

//出栈
void SeqstackPop(Seqstack* stack)
{
    if (stack == NULL)
    {
        printf("非法输入");
        return;
    }
    if (stack->size == 1)         //如果当前有效数据只剩下一个
    {                              //出栈的同时进行销毁栈
        SeqstackDestroy(stack);
        return;
    }
    stack->size--;        //出栈后,栈长度自减
}


//取栈顶元素
Seqstacktype SeqstackGet(Seqstack* stack)
{
    if (stack == NULL)
    {
        printf("非法输入");
        return 0;
    }
    Seqstacktype ret = stack->data[stack->size - 1];   //栈顶元素
    return ret;
}

测试函数

文件名 test.c

#include"seqstack.h"

#define FUNCTION() printf("**************   %s   **************\n",__FUNCTION__); 


//打印函数
void Printchar(Seqstack* stack, const char *msg)
{
    printf("[%s]:\n", msg); 
    if (stack == NULL)
    {
            return;
    }
    size_t i = 0;
    for (; i < stack->size; i++)
    {
        printf("%c", stack->data[i]);
    }
    printf("\n");
}


void TestInit()
{
    FUNCTION();
    Seqstack stack;
    SeqstackInit(&stack);

    printf("size expected 0,actual %lu\n", stack.size);
    printf("capacity expected 1000,actual %lu\n", stack.capacity);
}

void TestPush()
{
    FUNCTION();
    Seqstack stack;
    SeqstackInit(&stack);

    SeqstackPush(&stack, 'a');
    Printchar(&stack, "入栈一个元素");
    SeqstackPush(&stack, 'b');
    Printchar(&stack, "入栈二个元素");
    SeqstackPush(&stack, 'c');
    Printchar(&stack, "入栈三个元素");
    SeqstackPush(&stack, 'd');
    Printchar(&stack, "入栈四个元素");
}


void TestGet()
{
    FUNCTION();
    Seqstack stack;
    SeqstackInit(&stack);

    SeqstackPush(&stack, 'a');
    Printchar(&stack, "入栈一个元素");
    SeqstackPush(&stack, 'b');
    Printchar(&stack, "入栈二个元素");
    SeqstackPush(&stack, 'c');
    Printchar(&stack, "入栈三个元素");
    SeqstackPush(&stack, 'd');
    Printchar(&stack, "入栈四个元素");

    Seqstacktype ret = SeqstackGet(&stack);
    printf("取栈顶元素为:[ %c ] \n", ret);
    SeqstackPop(&stack);
    Printchar(&stack, "出栈一个元素");

    ret = SeqstackGet(&stack);
    printf("取栈顶元素为:[ %c ] \n", ret);
    Printchar(&stack, "出栈一个元素");

}

void TestPop()
{
    FUNCTION();
    Seqstack stack;
    SeqstackInit(&stack);

    SeqstackPush(&stack, 'a');
    Printchar(&stack, "入栈一个元素");
    SeqstackPush(&stack, 'b');
    Printchar(&stack, "入栈二个元素");
    SeqstackPush(&stack, 'c');
    Printchar(&stack, "入栈三个元素");
    SeqstackPush(&stack, 'd');
    Printchar(&stack, "入栈四个元素");

    SeqstackPop(&stack);
    Printchar(&stack, "出栈一个元素");
    SeqstackPop(&stack);
    Printchar(&stack, "出栈两个元素");
    SeqstackPop(&stack);
    Printchar(&stack, "出栈三个元素");
    SeqstackPop(&stack);
    Printchar(&stack, "出栈四个元素");


}


int main()
{
    TestInit();
    TestPush();
    TestPop();
    TestGet();
    return 0;
}

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值