前言
之前我不懂的时候,我看其他大佬写的代码简直一头雾水啊,各种复杂操作。。。现在我写了一个超简洁版的,目的是主要体现顺序栈原理,希望对读者有帮助。
简述原理
这段代码是顺序栈的实现。顺序栈的最大特点是长度不变,预先分配好一段存储单元,存储的数据物理上连续。关于栈的构建是用数组来实现的。而入栈出栈操作用会“能上下移动”的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);
}
}
如果这篇文章对你有所帮助,可以点赞支持一下(^ -^)