C语言数据结构---栈(全注释)

可以直接通过代码和代码注释的结合来学习并理解数据结构--栈的基本逻辑,比单纯的看文字理解代码更有乐趣,不过笔者建议在看代码之前可以先去本链接下的视频学习下数据结构---栈会事半功倍哦~ 

注:本视频来源于B站大佬:@动画讲编程的视频

看动画,5分钟学会五个经典的线性数据结构,栈、队列、双向链表、跳表、双端队列_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV18o4y1o7xa/?spm_id_from=333.337.search-card.all.click&vd_source=d16e4170ec5d95766145b717597ec72f

#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);           //再次遍历
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值