数据结构:超基础!超详细!超简单!——C语言数组实现顺序栈的创建及基本操作的使用

前言

之前我不懂的时候,我看其他大佬写的代码简直一头雾水啊,各种复杂操作。。。现在我写了一个超简洁版的,目的是主要体现顺序栈原理,希望对读者有帮助。

简述原理

这段代码是顺序栈的实现。顺序栈的最大特点是长度不变,预先分配好一段存储单元,存储的数据物理上连续。关于栈的构建是用数组来实现的。而入栈出栈操作用会“能上下移动”的top元素来指定数组的特定存储单元。比如说,top=1.,那stack[top]指示的就是stack[1],如果top=3,那就是数组的第3个元素辣。至于怎么保持top的数字永远指的是最顶端的元素:压入的时候top+1,出栈top-1,那top永远就是指向最顶层的元素辣,可以暂停阅读仔细想想是不是这样哦

在这里插入图片描述
但当出栈一个元素时:
在这里插入图片描述
此时看到,top竟然没有指向最上层的元素!这没关系的,下次压入一个数字5时,top会向上指,刷新3这个数字。即如下图

在这里插入图片描述
所以即使出栈时不刷新单元内容,也没有关系。

关于代码

只保留了这些功能
1.栈的创建
2.栈有没有满的判定代码
3.栈是不是空的判定代码
3.入栈操作
4.出栈操作

精简就精简在削去了:

1.返回栈元素个数操作
2.控制台交互代码。改为控制操作基本在源代码里进行。

并且尽可能对命名与结构进行优化,添加详细注释,使代码便于阅读。

代码如下

初学者注意define、typedef、malloc的用法。

#include<stdio.h>
#include<stdlib.h> 
#include<malloc.h>
#define size 20 //C语音宏定义,在这里可以分配整个栈的大小
#define N 3	//这里可以指定压入多少个数据 ,我这里压3个
#define M 4	//这里可以指定出栈多少个数据 ,我这里出4个
typedef struct Type{
	int stack[size];
	int top; 
}StackType; 

int YN_full(StackType *p){			//这个是判断栈是否满的函数,YN:是否的意思,如果满栈,当然要拒绝入栈操作 
	if(p->top==size-1){				//如果栈顶指示器top等于19(size被define定义为20),则已经表明top指向栈顶了,此时不可再压栈了
		return 0; 
	}
	else 
	{printf("可压栈\n"); 
	return 1;
	}
} 

int YN_empty(StackType *p){				//判断是否空栈 
	if((p->top)==0){					//思路与上面判断是否空栈大同小异 
		return 0; 
	}
	else 
	{
	return 1;
	}
} 

int in_stack(StackType *p,int x){			//压栈函数 
	
	if(YN_full(p)==1){
		p->top = (p->top)+1;			//p.top表示指向结构体p里的top元素,类似于地球.中国,这里加1是因为压栈是压在现在元素的上一个存储单元 
		p->stack[p->top]=x; 			//赋值操作	
	}
	else{
		printf("栈满!拒绝压压压压压压栈操作!"); 
	} 
}

int pull_stack(StackType *p){				//出栈函数 
	
	if(YN_empty(p)==1){
		printf("%d\n",p->stack[p->top]); 
		p->top=(p->top)-1; 				//可以看到出栈操作是没有把值清空的,这是为什么呢?后面有说明 
	}else
	{
		printf("栈满!拒绝出出出出出栈操作!");
	} 
} 


int main(){
	
	 StackType *s; 
	
	 s=(StackType*) malloc (size* sizeof(StackType));
	 
	 int many;			// many是多少的意思,意思是多少个数据,控制下面for循环次数 
	 
	 int a; 			//容器。。。 
	 
	 int number=N;		//还是容器,存放数据用的 
	 
	 s->top = 0;		//此程序大坑之一,程序结果出错搞了半小时没搞明白,原来是少了这句。top没被赋值之前不可使用。可是我怎么记得在gcc,不赋值默认是0?所以一直没怀疑这里 
	 
	 printf("开始压栈,请输入%d个数字,按一个数字按一次回车\n",number); 
	 
	 for(many=1;many<=N;many++){	//入栈操作
	   	
	 	scanf("%d",&a);
		 
		in_stack(s,a); 
	 	
	 }
	 
	
	
	printf("出栈结果如下\n"); 
	 
	for(many=1;many<=M;many++){		//出栈操作 
	 	
	 	pull_stack(s); 
	 
	 } 
} 

如果这篇文章对你有所帮助,可以点赞支持一下(^ -^)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值