数据结构栈的顺序存储(c语言描述)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构栈的顺序存储(c语⾔描述)
考研之路⼜挺近了⼀步,今天主要我⾃⼰写了⼀下栈的顺序存储,栈是⼀个后进先出的线性表,它只允许在表尾进⾏插⼊和删除,其实还是属于线性表的范畴,只要我们把线性表的⼀些相关操作搞清楚了,栈就很容易搞清楚了,⾸先我们要搞清楚栈顶其实就是表尾,⽽栈底是表头,下⾯来展⽰代码吧:
1.声明结构体
#define MAXSIZE 10 //容量
#define INSERTSIZE 5 //增加容量
typedef int ElemType;
typedef struct{
ElemType *top; //指向栈顶的指针
ElemType *base; //指向栈底的指针
int stackLength; //栈的容量
}stack,*link;
2.栈的初始化
void initStack(stack *s) //这⾥使⽤ stack *s 和 link s效果⼀模⼀样
{
s->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
if(!s->base)
{
printf("空间申请失败\n");
}
s->top=s->base; //⼀开始栈顶和栈底在同⼀位置
s->stackLength=MAXSIZE; //栈的最⼤容量
}
3.⼊栈操作
⾥⾯realloc其实是malloc的封装函数,重新申请空间的意思,可以将之前空间的数据赋值过去
void push(stack *s,int e)
{
if((s->top-s->base)==s->stackLength) //栈的空间满了
{
s->base=(ElemType*)realloc(s->base,(s->stackLength+INSERTSIZE)*sizeof(ElemType)); //重新分配空间
s->top=s->base+s->stackLength; //分配栈顶的位置
s->stackLength+=INSERTSIZE; //设置最⼤容量
}
*(s->top)=e; //给空间数值赋值
s->top++;
}
4.出栈操作
ElemType pop(stack *s,int *e)//这⾥要⽤引⽤,传回数值
{
if(s->top==s->base) //如果栈为空
{
printf("栈为空,⽆法出栈\n");
return -1;
}
else
{
*e=*(--s->top); //先将栈顶向下移⼀位再取出数据
return *e;
}
}
5.清空操作
void clearStack(stack *s)
{
s->top=s->base;
}
6.销毁栈的操作
//销毁栈
void destroyStack(stack *s)
{
int length,i;
length=s->top-s->base; //栈的容量
for(i=0;i<length;i++)
{
free(s->base); //释放栈底空间
s->base++;
}
s->top=s->base=NULL;
s->stackLength=0;
}
所有的代码如下:
#include<stdlib.h>
#include<stdio.h>
#define MAXSIZE 10 //容量
#define INSERTSIZE 5 //增加容量
typedef int ElemType;
typedef struct{
ElemType *top; //指向栈顶的指针
ElemType *base; //指向栈底的指针
int stackLength; //栈的容量
}stack,*link;
//栈的初始化
void initStack(stack *s) //这⾥使⽤ stack *s 和 link s效果⼀模⼀样
{
s->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
if(!s->base)
{
printf("空间申请失败\n");
}
s->top=s->base; //⼀开始栈顶和栈底在同⼀位置
s->stackLength=MAXSIZE; //栈的最⼤容量
}
//⼊栈
void push(stack *s,int e)
{
if((s->top-s->base)==s->stackLength) //栈的空间满了
{
s->base=(ElemType*)realloc(s->base,(s->stackLength+INSERTSIZE)*sizeof(ElemType)); //重新分配空间 s->top=s->base+s->stackLength; //分配栈顶的位置
s->stackLength+=INSERTSIZE; //设置最⼤容量
}
*(s->top)=e; //给空间数值赋值
s->top++;
}
//出栈
ElemType pop(stack *s,int *e)//这⾥要⽤引⽤,传回数值
{
if(s->top==s->base) //如果栈为空
{
printf("栈为空,⽆法出栈\n");
return -1;
}
else
{
*e=*(--s->top); //先将栈顶向下移⼀位再取出数据
return *e;
}
}
//清空
void clearStack(stack *s)
{
s->top=s->base;
}
//销毁栈
void destroyStack(stack *s)
{
int length,i;
length=s->top-s->base; //栈的容量
for(i=0;i<length;i++)
{
free(s->base); //释放栈底空间
s->base++;
}
s->top=s->base=NULL;
s->stackLength=0;
}
int main()
{
stack s;
initStack(&s);//栈的初始化
printf("结束操作-------0\n");
printf("⼊栈操作-------1\n");
printf("出栈操作-------2\n");
printf("清空栈的操作-------3\n");
printf("销毁栈的操作-------4\n");
int number,e; //指令 ,数据
printf("请输⼊指令");
scanf("%d",&number);
while(number!=0)
{
switch(number)
{
case1: //⼊栈操作
printf("⼊栈的数值为:");
scanf("%d",&e);
push(&s,e);
break;
case2: //出栈操作
e=pop(&s,&e);
printf("出栈的元素值为:%d\n",e);
break;
case3: //清空栈的操作
clearStack(&s);
break;
case4: //销毁栈的操作
destroyStack(&s);
printf("栈已销毁\n");
break;
default:
printf("你输⼊的指令不正确\n");
}
printf("你的下⼀步指令为:");
scanf("%d",&number);
}
return0;
}
今天就这样了,如果⼤家有什么建议欢迎提出来。