完成顺序栈的
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
运行结果: