目录
希望这篇关于栈的博客能对大家有所帮助,欢迎大家在本篇博客下留言或私信与我交流!
一、栈的底层逻辑选择
栈底层逻辑可以用数组和链表实现
这里我们选择用数组实现栈
二、栈的规则
后进先出
三、栈的实现
创建3个文件
stack.h :放各种接口
stack.c:各种接口的具体实现过程
test.c:测试文件
3.1~3.8的代码为每一种接口的核心代码,栈完整的代码会在文章最后给出!
3.1 创建底层结构
在stack.h头文件中定义结构体
//结构体
typedef int stackdatatype;
typedef struct stack {
stackdatatype* a; //指向数组的指针
int top; //栈顶元素下标
int size; //栈的容量
}ST;
3.2 栈的初始化
void STInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->size = 0;
ps->top = 0;
}
3.3 入栈
void STPush(ST* ps, stackdatatype x)
{
assert(ps);
//栈已满
if (ps->top == ps->size)
{
//扩容
int newsize = ps->size == 0 ? 4 : ps->size * 2;
stackdatatype* tmp=(stackdatatype*)realloc(ps->a,sizeof(stackdatatype)*newsize);
if (tmp== NULL)
{
perror("realloc!");
return;
}
ps->a = tmp;
ps->size = newsize;
}
ps->a[ps->top] = x;
ps->top++;
}
3.4 出栈
void STPop(ST* ps)
{
assert(ps);
assert(!STEmpty(ps));
ps->top--;
}
3.5 取栈顶元素
stackdatatype STTop(ST* ps)
{
assert(ps);
assert(!STEmpty(ps));
return ps->a[ps->top - 1];
}
3.6 计算栈中有几个元素
int STSize(ST* ps)
{
assert(ps);
return ps->top;
}
3.7 判断栈是否为空
bool STEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
3.8 栈的销毁
void STDestory(ST* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->size = 0;
ps->top = 0;
}
四、栈的完整代码
stack.h头文件
//头文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
//结构体
typedef int stackdatatype;
typedef struct stack {
stackdatatype* a; //指向数组的指针
int top; //栈顶元素下标
int size; //栈的容量
}ST;
//初始化栈
void STInit(ST* ps);
//销毁栈
void STDestory(ST* ps);
//入栈
void STPush(ST* ps, stackdatatype x);
//出栈
void STPop(ST* ps);
//取栈顶元素
stackdatatype STTop(ST* ps);
//计算栈中元素个数
int STSize(ST* ps);
//判断栈是否为空
bool STEmpty(ST* ps);
//ST* ps是为了保持接口一致性
stack.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "stack.h"
void STInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->size = 0;
ps->top = 0;
}
void STDestory(ST* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->size = 0;
ps->top = 0;
}
void STPush(ST* ps, stackdatatype x)
{
assert(ps);
//栈已满
if (ps->top == ps->size)
{
//扩容
int newsize = ps->size == 0 ? 4 : ps->size * 2;
stackdatatype* tmp=(stackdatatype*)realloc(ps->a,sizeof(stackdatatype)*newsize);
if (tmp== NULL)
{
perror("realloc!");
return;
}
ps->a = tmp;
ps->size = newsize;
}
ps->a[ps->top] = x;
ps->top++;
}
void STPop(ST* ps)
{
assert(ps);
assert(!STEmpty(ps));
ps->top--;
}
stackdatatype STTop(ST* ps)
{
assert(ps);
assert(!STEmpty(ps));
return ps->a[ps->top - 1];
}
bool STEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
int STSize(ST* ps)
{
assert(ps);
return ps->top;
}
test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include "stack.h"
int main() {
ST s;
STInit(&s);
STPush(&s, 1);
STPush(&s, 2);
STPush(&s, 3);
STPop(&s);
for (int i = 0; i < s.top; i++)
{
printf("%d ", s.a[i]);
}
printf("%d ", STSize(&s));
STDestory(&s);
}