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

数据结构栈的顺序表实现基本功能
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;
}

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/yu876876/article/details/79993846