考研之路又挺近了一步,今天主要我自己写了一下栈的顺序存储,栈是一个后进先出的线性表,它只允许在表尾进行插入和删除,其实还是属于线性表的范畴,只要我们把线性表的一些相关操作搞清楚了,栈就很容易搞清楚了,首先我们要搞清楚栈顶其实就是表尾,而栈底是表头,下面来展示代码吧:
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("空间申请失败 "); } 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("栈为空,无法出栈 "); 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("空间申请失败 "); } 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("栈为空,无法出栈 "); 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 "); printf("入栈操作-------1 "); printf("出栈操作-------2 "); printf("清空栈的操作-------3 "); printf("销毁栈的操作-------4 "); int number,e; //指令 ,数据 printf("请输入指令"); scanf("%d",&number); while(number!=0) { switch(number) { case 1: //入栈操作 printf("入栈的数值为:"); scanf("%d",&e); push(&s,e); break; case 2: //出栈操作 e=pop(&s,&e); printf("出栈的元素值为:%d ",e); break; case 3: //清空栈的操作 clearStack(&s); break; case 4: //销毁栈的操作 destroyStack(&s); printf("栈已销毁 "); break; default: printf("你输入的指令不正确 "); } printf("你的下一步指令为:"); scanf("%d",&number); } return 0; }
今天就这样了,如果大家有什么建议欢迎提出来。