前言
栈是一种特殊的线性表,只允许在固定的一端进行插入和删除的操作,进行数据插入和删除的一端叫做栈顶,另一端叫做栈底。 栈中的数据元素遵循后进先出的的原则。
目录
1.压栈和出栈
2. 栈的实现
3.测试代码
1.压栈和出栈
压栈:栈的插入操作叫 压栈,入数据在栈顶。
弹栈:栈的删除操作叫做出栈。出数据也在栈顶。
如图:
2. 栈的实现
//stack.h
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
#include<stdbool.h>
typedef int SDataType;
typedef struct Stack
{SDataType* _a;int _top;//栈顶数据int _capacity;//容量
}Stack;
void StackInit(Stack* st);//初始化栈
void StackDestory(Stack* st);//销毁栈
void StackPush(Stack* st, SDataType data);//入栈
void StackPop(Stack* st);//出栈size_t StackSize(Stack* st);//获取栈中元素的数目SDataType StackTop(Stack* st);//获取栈顶元素bool StackEmpty(Stack* st);//判断栈是否为空
//stack.c
void StackInit(Stack* st)//初始化栈
{st->_a = (SDataType*)malloc(sizeof(SDataType) * 4);//申请空间//初始化数据st->_capacity = 4;st->_top = 0;
}
void StackDestory(Stack* st)//销毁栈
{free(st->_a);//释放空间st->_capacity = st->_top = 0;
}
void StackPush(Stack* st, SDataType data)//入栈
{assert(st);//判断指针是否存在if (st->_capacity == st->_top){//空间满了需要增容st->_capacity *= 2;SDataType* p = (SDataType *)realloc(st->_a, st->_capacity * sizeof(SDataType));if (p == NULL){printf("内存不足\n");exit(-1);}st->_a = p;}st->_a[st->_top] = data;++(st->_top);
}
void StackPop(Stack* st)//出栈
{assert(st);//确保指针存在assert(st->_top > 0);--(st->_top);
}
size_t StackSize(Stack* st)//获取栈中元素的数目
{assert(st);//确保指针存在size_t size = 0;return size = st->_top;
}
SDataType StackTop(Stack* st)//获取栈顶元素
{return st->_a[(st->_top) -1 ];
}
bool StackEmpty(Stack* st)//判断栈是否为空
{return !st->_top;
}
3.测试代码
void TestStack()
{Stack st;StackInit(&st);StackPush(&st, 1);StackPush(&st, 2);StackPush(&st, 3);StackPush(&st, 4);StackPush(&st, 5);StackPush(&st, 6);StackPush(&st, 7);StackPush(&st, 8);while (!StackEmpty(&st)){printf("%d ", StackTop(&st));StackPop(&st);}StackDestory(&st);
}