目录
前言:
大家好呀!(●'◡'●) 首先欢迎您能够浏览我的文章,希望我的文章能够帮助到你,或者给我指出其中的错误都可以啦~o((>ω< ))o 这是我学习过程中对c语言实现栈的一些理解,我们往下冲冲冲吧!
一、理解栈
1.定义
栈,属于数据结构中的一种,它是属于线性结构的。通常我们对栈的操作就是压栈和出栈,这也限定仅在表尾进行插入和删除操作的线性表 ,而这个表尾也就是栈顶,另一端就是栈底了。
简单一点来说就是先进后出 后进先出。可以类比一下往一个狭窄的箱子里放东西,放完后,拿出来的总是后面放的,而放这个动作就是压栈,拿出来就是出栈。
2.思维导图
下面用一个思维导图简述一下栈所要实现的具体功能 :
那么这里,我们要实现这些功能,肯定是要选择一个结构的,数组或者链表。我们想一下,既然是栈,我们存储数据是尾插,似乎数组和单链表都可以,但是,我们统计数据的时候,链表的话就需要遍历,在链表里添加变量统计个数的话稍微又麻烦,所以这里实现我选择的是数组,动态的。
二、栈的实现
1.声明功能,定义在Stack.h文件中
(注:使用编译器为vs2022)
Stack.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include <stdbool.h>//能够让c语言使用布尔类型的c语言//数据类型
typedef int STDataType;//定义栈的结构 我们用数据结构来表示
typedef struct Stack
{
STDataType* x;
int top;//实时储存
int capacity;//容量
}ST;//初始化函数
void StackInit(ST* ps);
//将此栈摧毁
void StackDestroy(ST* ps);
//压栈
void StackPush(ST* ps, STDataType x);
//出栈
STDataType StackTop(ST* ps);
//出栈 弹出数据
void StackPop(ST* ps);
//判断是否存在数据
bool StackEmpty(ST* ps);
//当前存在的数据个数
int StackSize(ST* ps);
2.实现功能的代码
Stack.c
#include"Stack.h"
//初始化函数
void StackInit(ST* ps)
{
assert(ps);
ps->x = NULL;
ps->top = 0;
ps->capacity = 0;
}//摧毁栈
void StackDestroy(ST* ps)
{
assert(ps);
free(ps->x);
ps->x = NULL;
ps->top = 0;
ps->capacity = 0;
}//压栈 实际上在顺序表的基础上禁止了头插而已,所以实际上就是一个尾插而已
void StackPush(ST* ps, STDataType x)
{
assert(ps);//第一类情况:首次进来和容量不足的情况
if (ps->top == ps->capacity)
{
int newcapcity = (ps->capacity == 0) ? 4 : (ps->capacity) * 2;//三目运算符确定
STDataType* temp = (STDataType*)realloc(ps->x, sizeof(STDataType));
if (temp == NULL)
{
printf("未能申请到空间呢\n");
exit(-1);
}
ps->x = temp;
ps->capacity = newcapcity;
}ps->x[ps->top] = x;
ps->top++;
}
//出栈 -输出数据
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));//确保里面还存在数据return ps->x[ps->top - 1];
}
//出栈 弹出数据
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->top--;
}//判断是否存在数据
bool StackEmpty(ST* ps)
{
assert(ps);//if (ps->top == 0)
// return 1;
//else
// return 0;//return ps->top == 0 ? 1 : 0;
return ps->top == 0;
}int StackSize(ST* ps)
{
assert(ps);return ps->top;
}
依次实现即可,其实它就是在实现顺序表的前提下做了一些特定的修正而已,在实现具体的功能上和顺序表略有差别,比如随机访问。
随后的测试代码自己测试就好啦 !
共同进步吧!