test.c
#include "stack.h"
int main()
{
TestStack();
return 0;
}
stack.c
#include "stack.h"
#include <malloc.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
//初始化
void StackInit(Stack* ps)
{
assert(ps);
ps->array = (SDataType*)malloc(sizeof(SDataType)* 10);
if (NULL == ps->array)
{
assert(0);
return;
}
ps->capacity = 10;
ps->size = 0;
}
//扩容
void CheckCapacity(Stack* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
//1.开辟新空间
SDataType* temp = (SDataType*)malloc(sizeof(SDataType)*ps->size * 2);
if (temp == NULL)
{
assert(0);
return;
}
//2.拷贝元素
memcpy(temp, ps->array, sizeof(SDataType)*ps->size);
//3.释放就空间
free(ps->array);
//4.使用新空间
ps->array = temp;
ps->capacity *= 2;
}
}
//入栈:尾插
void StackPush(Stack* ps, SDataType data)
{
assert(ps);
CheckCapacity(ps);
ps->array[ps->size++] = data;
}
//出栈:尾删
void StackPop(Stack* ps)
{
if (StackEmpty(ps))
return;
ps->size--;
}
//获取栈顶的元素
SDataType StackTop(Stack* ps)
{
assert(!StackEmpty(ps));
return ps->array[ps->size - 1];
}
//获取栈中有效元素的个数
int StackSize(Stack* ps)
{
assert(ps);
return ps->size;
}
//检测栈是否为空
int StackEmpty(Stack* ps)
{
assert(ps);
return ps->size == 0;
}
//销毁
void StackDestroy(Stack* ps)
{
assert(ps);
free(ps->array);
ps->array = NULL;
ps->capacity = 0;
ps->size = 0;
}
void TestStack()
{
Stack s;
StackInit(&s);
StackPush(&s, 1);
StackPush(&s, 2);
StackPush(&s, 3);
StackPush(&s, 4);
StackPush(&s, 5);
StackPush(&s, 6);
StackPush(&s, 7);
printf("%d\n", StackTop(&s));
printf("%d\n", StackSize(&s));
StackPop(&s);
StackPop(&s);
StackPop(&s);
printf("%d\n", StackTop(&s));
printf("%d\n", StackSize(&s));
StackDestroy(&s);
}
stack.h
#pragma once//防止重复包含
typedef int SDataType;
/*
静态栈
#define MAXSIZE 100
typedef struct Stack
{
SDataType array[MAXSIZE];
int top;//标记栈顶
}stack;
如果在笔试时需要用到栈,自己可以快速定义一个静态栈,不用考虑扩容
*/
typedef struct Stack
{
SDataType* array;
int capacity;//容量
int size;//栈中元素的个数 栈顶
}Stack;
//注意:
//1.栈中没有任意位置的插入和删除操作
//2.栈不需要查找--遍历
//初始化
void StackInit(Stack* ps);
//入栈:尾插
void StackPush(Stack* ps, SDataType data);
//出栈:尾删
void StackPop(Stack* ps);
//获取栈顶的元素
SDataType StackTop(Stack* ps);
//获取栈中有效元素的个数
int StackSize(Stack* ps);
//检测栈是否为空
int StackEmpty(Stack* ps);
//销毁
void StackDestroy(Stack* ps);
//测试
void TestStack();