可以直接通过代码和代码注释的结合来学习并理解数据结构--栈的基本逻辑,比单纯的看文字理解代码更有乐趣,不过笔者建议在看代码之前可以先去本链接下的视频学习下数据结构---栈会事半功倍哦~
注:本视频来源于B站大佬:@动画讲编程的视频
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/***********************************数据结构----栈************************/
#define DATASIZE_MAX 100//定义栈区最大范围
//定义一个栈结构体
typedef struct
{
int data[DATASIZE_MAX];//数据存储区
int top; //栈顶指针(在栈中,栈顶的位置)
}Stack_t;
//创建一个空栈
Stack_t* Create_Stack(void)
{
Stack_t* s = (Stack_t*)malloc(sizeof(Stack_t));//为栈区申请内存
s->top = -1; //将栈顶指针置为不存在,(因为栈中不存在数据,所以就不存在栈顶
return s; //所以初始化置为-1)这是因为栈和数组的结构类似,下标以0为第一个元素,所以我们需要将栈顶指针赋值为-1来表示其不存在(即为空栈)
}
//判断栈是否为空
int isEmpty(Stack_t* s)
{
return s->top == -1;//栈顶指针为-1即为空栈
}
//判断栈是否已满
int isFull(Stack_t* s)
{
return s->top == DATASIZE_MAX -1;//栈顶指针为DATASIZE_MAX-1即为刚好装满这个栈
}
//入栈操作
Stack_t* Push_Stack(Stack_t* s, int value)
{
if (isFull(s)) //如果栈已经满了的话
{
printf("stack is already full!!!");
return s; //直接退出就不进栈
}
s->top++; //每进一次,栈中数据就+1,所以栈顶的位置就要+1
s->data[s->top] = value; //将数据存入栈内(目前的栈的栈顶的位置)
return s;
}
//出栈操作
int Pop_Stack(Stack_t* s)
{
if (isEmpty(s)) //如果栈是空的话
{
printf("stack is empty!!!");
return 0; //直接退出就不出栈
}
int value = s->data[s->top]; //将栈顶的值赋给value
s->top--; //栈顶的位置减1
return value;
}
//遍历并打印栈中的所有元素
void Ergodic_Stack(Stack_t* s)
{
if (isEmpty(s)) //如果栈是空的话
{
printf("stack is empty!!!");
return; //直接退出就不遍历栈
}
/*for (int i = 0; i <= s->top; i++) //从栈底开始遍历
{
printf("pos=%d--%d\n",i,s->data[i]); //(一般不用这种方法,虽然也可以成功遍历,但是这种方法并不符合栈的数据结构规则,所以以这种方法遍历的话会导致增加底层代码运行时的空间,时间复杂度)
}*/
for (int i = s->top; i >=0; i--) //从栈顶开始遍历
{
printf("pos=%d--%d\n", i, s->data[i]);
}
}
//示例
int main(void)
{
Stack_t* test_s = Create_Stack();//创建一个空栈
printf("Start Push Stack\n");
test_s=Push_Stack(test_s, 10); //第一次进栈
test_s=Push_Stack(test_s, 20); //...
test_s=Push_Stack(test_s, 30);
test_s=Push_Stack(test_s, 40);
printf("Push Stack Finlish\n");
Ergodic_Stack(test_s); //遍历栈
printf("Start Pop Stack once\n");
int pop_result = Pop_Stack(test_s);//出栈一次
printf("Pop Stack Finlish\n");
printf("Pop Stack result=%d\n", pop_result);
printf("Again Ergodic Stack\n");
Ergodic_Stack(test_s); //再次遍历
}