Linux数据结构——栈(用顺序表实现)

用顺序表实现的栈和顺序表有什么区别呢?

我们先来分析下它们的结构体

顺序表:

typedef char SeqListType;

typedef struct SeqStack{
    SeqListType data[MAZ_SIZE];
    size_t size;
}
MAX_SIZE是这个顺序表最多能容纳的数据

size为当前的元素的个数

栈:

typedef char SeqStackType;

typedef struct SeqStack{
    SeqStackType* data;
    size_t size;
    size_t capacity;
}
size为栈内元素的个数
capacity为data这段内存中容纳的元素个数

1.顺序表已经定义好了最大的长度;而栈的最大长度可以进行动态扩容。
2.顺序表可以对内部元素进行各种操作,包括遍历等;而栈只有三种操作:入栈、出栈、取栈顶元素,这样可以使栈内的数据更安全。


以下为用顺序表实现栈的代码:

.c文件

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

void SeqStackInit(SeqStack* stack)
{
    stack->size = 0;
    stack->capacity = 1000;
    stack->data = (SeqStackType*)malloc(stack->capacity*sizeof(SeqStackType));
}

void SeqStackDestory(SeqStack* stack)
{
    free(stack->data);
    stack->size = 0;
    stack->capacity = 0;
}
void SeqStackReSize(SeqStack* stack)//扩容
{
    if (stack == NULL)
        return;
    stack->capacity = stack->capacity*2 + 1;//扩容规则自己定
    SeqStackType* new_data = (SeqStackType*)malloc(stack->capacity * sizeof(SeqStackType));
    //再将原来data中的数据搬运
    size_t i = 0;
    for(;i < stack->size; ++i)
    {
        new_data[i] = stack->data[i];
    }
    //释放原malloc的内存
    free(stack->data);
    stack->data = new_data;
    return;
}
void SeqStackPushBack(SeqStack* stack, SeqStackType value)
{
    if (stack == NULL)
        return;//非法输入
    if (stack->size >= stack->capacity)//判断栈满
    {
        SeqStackReSize(stack);//扩容
        stack->data[stack->size++] = value;//入栈
    }
    else
    {
        stack->data[stack->size++] = value;//直接入栈
    }
    return;

}

void SeqStackPrintChar(SeqStack* stack, const char* msg)
{
    printf("%s\n",msg);
    size_t i = 0;
    for(;i < stack->size; ++i)
    {
        printf("[%c]",stack->data[i]);
    }
    printf("\n");
    return;
}
void SeqStackPopBack(SeqStack* stack)
{
    if (stack == NULL)//非法输入
        return;
    if (stack->size == 0)//空栈
        return;
    --stack->size;
        return;
}
int SeqStackTop(SeqStack* stack, SeqStackType* value)//返回栈顶元素的值
{
    if( stack == NULL )
        return 1;//0表示取值成功,1表示失败
    if( stack->size == 0 )
        return 1;//空栈 
    *value = stack->data[stack->size-1];
    return 0;
}
void TestSeqStackPushBack()
{
    SeqStack stack;
    SeqStackInit(&stack);
    SeqStackPushBack(&stack,'a');
    SeqStackPushBack(&stack,'b');
    SeqStackPushBack(&stack,'c');
    SeqStackPushBack(&stack,'d');
    SeqStackPrintChar(&stack,"入栈");
}
void TestSeqStackPopBack()
{
    SeqStack stack;
    SeqStackInit(&stack);
    SeqStackPushBack(&stack,'a');
    SeqStackPushBack(&stack,'b');
    SeqStackPushBack(&stack,'c');
    SeqStackPushBack(&stack,'d');
    printf("%d\n",stack.size);
    SeqStackPopBack(&stack);
    printf("%d\n",stack.size);
    SeqStackPrintChar(&stack,"出栈");
}
void TestSeqStackTop()
{
    SeqStack stack;
    SeqStackInit(&stack);
    SeqStackPushBack(&stack,'a');
    SeqStackPushBack(&stack,'b');
    SeqStackPushBack(&stack,'c');
    SeqStackPushBack(&stack,'d');
    SeqStackType value ;
    int temp = SeqStackTop(&stack, &value);
    if(temp == 0)//取栈顶元素成功
    {
        printf("栈顶元素是:%c\n",value);
    }
    else
    {
        printf("取栈顶元素失败\n");
    }
}
int main()
{
    TestSeqStackPushBack();
    TestSeqStackPopBack();
    TestSeqStackTop();
    return 0;
}
.h文件

#pragma once 
#include<stdio.h>

typedef char  SeqStackType;
typedef struct SeqStack
{
    SeqStackType* data;
    size_t size;
    size_t capacity;
}SeqStack;
//栈初始化
void SeqStackInit(SeqStack* stack);

//栈的销毁
void SeqStackDestory(SeqStack* stack);

//实现栈的动态扩容
void SeqStackReSize(SeqStack* stack);//扩容

//入栈
void SeqStackPushBack(SeqStack* stack, SeqStackType value);

//打印栈
void SeqStackPrintChar(SeqStack* stack, const char* msg);

//出栈
void SeqStackPopBack(SeqStack* stack);

//取栈顶元素
int SeqStackTop(SeqStack* stack, SeqStackType* value);//返回栈顶元素的值

测试结果如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值