完成顺序栈的基本操作

1.初始化
2.销毁
3.入栈
4.出栈
5.取栈顶元素 


seqstack.h

#pragma once 
#include<stdio.h>
#include<stddef.h>
#include<stdlib.h>
typedef char SeqStackType;
typedef struct SeqStack{
SeqStackType* data;//指针类型,使内存可以动态管理
size_t size;      //栈元素的有效个数
size_t capacity;  //栈默认的空间,data这段内存能容纳的元素个数
}SeqStack;
void SeqStackInit(SeqStack* stack);//初始化函数
//怎么写SeqStackInit取决于怎么用
//SeqStack stack
//SeqStackInit(&stack) 直接对变量进行初始化,初始化函数就用*
//SeqStack* stack
//SeqStackInit(&stack) 先定义指针,不分配内存,SeqStackInit就要给结构体分配内存,用**
void SeqStackDestroy(SeqStack* stack); //销毁函数(与Init保持一致)
void SeqStackReSize(SeqStack* stack); //扩容
void SeqStackPush(SeqStack* stack, SeqStackType value);//入栈
void SeqStackPop(SeqStack* stack); //出栈
int SeqStackTop(SeqStack* stack,SeqStackType *value);//取栈顶的元素
void SeqStackPrintChar(SeqStack* stack, const char* msg);//打印函数

seqstack.c

#include "seqstack.h"
void SeqStackInit(SeqStack* stack){//初始化函数
if (stack == NULL){
//非法输入
return;
}
stack->size = 0;
stack->capacity = 1000;
stack->data = (SeqStackType*)malloc(stack->capacity*sizeof(SeqStackType));//给这1000个元素分配对应的内存
}
void SeqStackDestroy(SeqStack* stack){//销毁函数(与Init保持一致)
free(stack->data);
stack->size = 0;
stack->capacity = 0;
}
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 SeqStackReSize(SeqStack* stack){ //扩容
if (stack == NULL){
//非法输入
return;
}
if (stack->size < stack->capacity){
return;
}
stack->capacity = stack->capacity * 2 + 1;
//*2 :与STL风格保持一致,也可以按自己的意愿扩容。+1:如果capacity为0,不加一内存依旧为0
SeqStackType* newptr = (SeqStackType*)malloc(stack->capacity * sizeof(SeqStackType));
//把之前的数据挪到新开辟的内存上(遍历)
size_t i = 0;
for (; i < stack->size; i++){
newptr[i]=stack->data[i];
}
free(stack->data);
stack->data = newptr;
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--;   //只需将有效元素设为无效即可
}
int SeqStackTop(SeqStack* stack, SeqStackType* value){//取栈顶的元素
//int:返回是否成功。value:输出型参数,把返回的元素放在value对应的内存当中
//调用者把内存开辟好,把内存的指针传到函数中,函数直接往指针上赋值
if (stack == NULL||value == NULL){
//非法输入
return 0;
}
if (stack->size == 0){
//空栈
return 0;
}
*value = stack->data[stack->size - 1];//不能使用size--,这样会修改size的指向,删除元素
return 1;
}

test.c

#include "seqstack.h"
#define TEST_HEADER printf("\n======================%s========================\n",__FUNCTION__);
void TestInit(){
TEST_HEADER;
SeqStack stack;
SeqStackInit(&stack);
printf("size expect is 0,actual is %lu\n", stack.size);
printf("capacity expect is 1000,actual is %lu\n", stack.capacity);
}
void TestDestroy(){
TEST_HEADER;
SeqStack stack;
SeqStackInit(&stack);
SeqStackDestroy(&stack);
}
void TestPush(){
TEST_HEADER;
SeqStack stack;
SeqStackInit(&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);
SeqStackPop(&stack);
SeqStackPrintChar(&stack, "出栈两个元素");
SeqStackPop(&stack);
SeqStackPop(&stack);
SeqStackPrintChar(&stack, "再出栈两个元素");
SeqStackPop(&stack);
SeqStackPrintChar(&stack, "尝试对空栈出栈");
}
void TestTop(){
TEST_HEADER;
SeqStack stack;
SeqStackInit(&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("expect is 1,actual is %d\n", ret);
printf("expect value is d,actual is %c\n", value);


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


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

猜你喜欢

转载自blog.csdn.net/qq_40995354/article/details/79866199
今日推荐