版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
代码的关键在于“先进后出”,本代码实现了求链栈的长度 ,取栈顶,进栈,出栈,遍历栈。
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define true1
#define ok 1
#define error 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define maxn 100
#define num 10
typedef struct{
int *base;
int *top;
int stacksize;
}stack;
//创建个空链栈
int InitStack(stack &S){
if(S.base!=NULL){
return error;
}
S.base = (int *)malloc(maxn*sizeof(int));
if(!S.base)
exit(OVERFLOW);
S.top = S.base;
S.stacksize = maxn;
return ok;
}
//求链栈的长度
int StackLength(stack S){
if(S.base==NULL)
return INFEASIBLE;
if(S.top==S.base)
return 0;
int i = 0;
int *p=S.top;
while(p!=S.base){
int e = *p;
p--;
i++;
}
return i;
}
//取栈顶
int GetTop(stack S,int &e){
if(S.top==S.base)
return error;
e = *--S.top;
return ok;
}
//进栈
int Push(stack &S,int &e){
if(S.top-S.base>=S.stacksize){
S.base = (int *)realloc(S.base,(S.stacksize+num)*sizeof(int));
if(!S.base)
exit(OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize+=num;
}
*S.top++=e;
return ok;
}
//出栈
int Pop(stack &S,int &e){
if(S.top==S.base)
return error;
printf("%d\n",e = *--S.top) ;
return ok;
}
//遍历栈
int StackTreaverse(stack S){
if(S.base==NULL)
return INFEASIBLE;
if(S.base==S.top){
printf("栈空");
return ok;
}
int *p = S.top;
int i=1;
int e;
while(p!=S.base){
if(i!=1)
printf("\n");
e = *--p;
printf("距栈顶元素长为%-3d的元素为: %d",i++,e);
}
return ok;
}
int main(){
stack S;
S.base=NULL;
int e,n;
InitStack(S);
printf("创建空栈成功\n");
StackLength(S);
printf("请输入几个数进栈\n");
scanf("%d",&n);
printf("请输入入栈的元素的值:\n");
for(int i=0;i<n;i++)
{
scanf("%d",&e);
Push(S,e);
}
printf("取栈顶得元素\n");
printf("%d\n",GetTop(S,e));
printf("弹出栈首: ");
Pop(S,e);
printf("更新栈\n");
StackTreaverse(S);
return 0;
}