1.栈
栈是一种数据结构。该结构的特点是:先进后出,后进先出。你可以形象的把他想成一个上面开口,下面封口的箱子。先放进去的元素被“压箱底”,而后放进去的元素相对来说在靠近上面的位置。你想拿到压箱底的元素,就必须将它上面的元素先拿出来。比如一组数据12345,把他们一次入栈之后,再将其取出来,顺序就变成了54321。由于栈的这种特性,我们在做题的时候碰到“逆序”,要能够想到它,进栈出栈一次,就逆序啦。
2.栈的c语言代码实现
Stack.h
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#define NUM 4
typedef int StackDataType;
typedef struct Stack
{
StackDataType* arr;
int top;
int capacity;
}Stack;
void StackInit(Stack* ps);//初始化
void StackInsert(Stack* ps, StackDataType data);//入栈
void StackPop(Stack* ps);//出栈
StackDataType StackTop(Stack* ps);//获取栈顶元素
int StackSize(Stack* ps);//获取栈中有效元素个数
bool StackEmpty(Stack* ps);//判断栈是否为空
void StackDestroy(Stack* ps);//栈的销毁
Stack.c
#include "Stack.h"
void StackInit(Stack* ps)
{
assert(ps);
ps->arr = NULL;
ps->top = ps->capacity = 0;
}
void CheckCapacity(Stack* ps)
{
if (ps->top == ps->capacity)
{
//空间不足,扩容
StackDataType* tmp = realloc(ps->arr, ps->capacity == 0 ? sizeof(StackDataType)*NUM : sizeof(StackDataType)*ps->capacity * 2);
if (NULL == tmp)
{
printf("realloc fail\n");
exit(1);
}
ps->arr = tmp;
ps->capacity *= 2;
}
}
void StackInsert(Stack* ps, StackDataType data)
{
assert(ps);
CheckCapacity(ps);
ps->arr[ps->top] = data;
ps->top++;
}
void StackPop(Stack* ps)
{
assert(ps);
if (ps->top > 0)
{
ps->top--;
}
}
StackDataType StackTop(Stack* ps)
{
assert(ps);
if (ps->top > 0)
{
return ps->arr[ps->top-1];
}
printf("栈中元素个数为0\n");
}
int StackSize(Stack* ps)
{
return ps->top;
}
bool StackEmpty(Stack* ps)
{
return ps->top == 0 ? true : false;
}
void StackDestroy(Stack* ps)
{
assert(ps);
free(ps->arr);
ps->arr = NULL;
ps->capacity = ps->top = 0;
}