顺序栈的基本操作

完成顺序栈的
1.初始化
2.销毁
3.入栈
4.出栈
5.取栈顶元素方法的实现

seqstack.h

#pragma once
#include<stddef.h>

typedef  char SeqStackType;

typedef struct SeqStack{
    SeqStackType* data;
    size_t size;
    size_t capacity;//MAX_SIZE 的替代品,data这段内存中能容纳的元素个数;
}SeqStack;

void SeqStackInit(SeqStack* data);//初始化

void SeqStackDestroy(SeqStack* stack);//销毁

void SeqStackReSize(SeqStack* stack);//扩容

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

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

int SeqStackTop(SeqStack* stack,SeqStackType* value);//取栈顶元素。返回两个信息:执行成功失败;栈顶元素的值是多少;

seqstack.c

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

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){
    free(stack->data);
    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);
    }
    stack->data[stack->size++] = value;
}

void SeqStackPop(SeqStack* stack){
    if(stack == NULL){
        //非法输入
        return;
    }
    if(stack->size == 0){
        //空栈
        return;
    }
    --stack->size;
    return;
}

int SeqStackTop(SeqStack* stack,SeqStackType* value){
    if(stack == NULL || value == NULL){
        //非法输入
        return;
    }
    if(stack->size == 0){
        //空栈
        return 0;
    }
    *value = stack->data[stack->size - 1];
    return 1;
}

//
///以下为测试代码/
//
#if 1
#include<stdio.h>
#define TEST_HEADER printf("\n===========%s===========\n",__FUNCTION__);


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");
}


void TestInit(){
    TEST_HEADER;
    SeqStack stack;
    SeqStackInit(&stack);
    printf("size expected 0,actual %lu\n",stack.size);
    printf("capacity expected 1000,actual %lu\n",stack.capacity);
}

void TestDestroy(){
    TEST_HEADER;
    SeqStack stack;
    SeqStackInit(&stack);
    SeqStackDestroy(&stack);
}

void TestPush(){
    TEST_HEADER;
    SeqStack stack;
    SeqStackPush(&stack,'a');
    SeqStackPush(&stack,'b');
    SeqStackPush(&stack,'c');
    SeqStackPush(&stack,'d');
    SeqStackPrintChar(&stack,"入栈四个元素");
}

void TestPop(){
    TEST_HEADER;
    SeqStack stack;
    SeqStackInit(&stack);
    SeqStackPush(&stack,'a');
    SeqStackPush(&stack,'b');
    SeqStackPush(&stack,'c');
    SeqStackPush(&stack,'d');
    SeqStackPrintChar(&stack,"入栈四个元素");

    SeqStackPop(&stack);
    SeqStackPrintChar(&stack,"出栈一个元素");
    SeqStackPop(&stack);
    SeqStackPrintChar(&stack,"出栈两个元素");
    SeqStackPop(&stack);
    SeqStackPrintChar(&stack,"出栈三个元素");
    SeqStackPop(&stack);
    SeqStackPrintChar(&stack,"出栈四个元素");
    SeqStackPop(&stack);
    SeqStackPrintChar(&stack,"尝试对空栈出栈");
}

void TestTop(){
    TEST_HEADER;
    SeqStack stack;
    SeqStackInit(&stack);
    SeqStackPush(&stack,'a');
    SeqStackPush(&stack,'b');
    SeqStackPush(&stack,'c');
    SeqStackPush(&stack,'d');
    SeqStackPrintChar(&stack,"入栈四个元素");

    SeqStackType value;
    int ret = SeqStackTop(&stack,&value);
    printf("ret expected 1,actual %d\n",ret);
    printf("value expected d,actual %c\n",value);

    SeqStackPop(&stack);
    SeqStackPop(&stack);
    ret = SeqStackTop(&stack,&value);
    printf("ret expected 1,actual %d\n",ret);
    printf("value expected b,actual %c\n",value);

    SeqStackPop(&stack);
    SeqStackPop(&stack);
    ret = SeqStackTop(&stack,&value);
    printf("ret expected 0,actual %d\n",ret);
}
int main (){
    TestInit();
    TestDestroy();
    TestPush();
    TestPop();
    TestTop();
    return 0;
}

#endif

运行结果:
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值