119 lines
1.7 KiB
C
119 lines
1.7 KiB
C
#include<stdio.h>
|
|
#include<string.h>
|
|
#include<malloc.h>
|
|
#include<stdlib.h>
|
|
|
|
|
|
|
|
typedef struct
|
|
{
|
|
/* data */
|
|
int length;//初始默认数组长度,随着数组扩充同步增加
|
|
int add;//空位不够的时候一次增加的个数
|
|
int top;//当前数组的位置
|
|
int *start;//起始位置的指针,老师上课写了我也不知道为什么
|
|
|
|
}zhan;
|
|
|
|
|
|
|
|
int zadd(zhan *z,int x);
|
|
void zinit(zhan *z);
|
|
int zreduce(zhan *z,int *a);
|
|
void zfree(zhan *z);
|
|
|
|
int main (){
|
|
zhan z;
|
|
int a;
|
|
int num;
|
|
zinit(&z);
|
|
printf("要输入多少个数字呢");
|
|
scanf("%d",&num);
|
|
for(int i=0;i<num;i++){
|
|
scanf("%d",&a);
|
|
zadd(&z,a);
|
|
}
|
|
|
|
printf("输出全部数字\n"); //输出数字
|
|
for(int i=0;i<(z.top);i++){
|
|
printf("%d",z.start[i]);
|
|
}
|
|
|
|
|
|
|
|
printf("现在开始出栈\n");
|
|
// int b;
|
|
// int c=zreduce(&z,&b);
|
|
// if(!c){
|
|
// printf("%d",b);
|
|
// }
|
|
// c=zreduce(&z,&b);
|
|
// if(!c){
|
|
// printf("%d",b);
|
|
// }
|
|
|
|
|
|
//出栈
|
|
while (z.top!=0)
|
|
{
|
|
/* code */
|
|
int b;
|
|
int c=zreduce(&z,&b);
|
|
if(!c){
|
|
printf("%d",b);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("结束111");
|
|
zfree(&z);
|
|
printf("结束222");
|
|
return 0;
|
|
}
|
|
|
|
|
|
int zadd(zhan *z,int x){ //往栈里面加入新的元素
|
|
//怎么加? 先看满没。满了就先扩容再加。没满则直接加上去,然后top+1
|
|
if(z->top==z->length){
|
|
z->start=(int*)realloc(z->start,(z->length+z->add)*sizeof(int));
|
|
z->length=z->length+z->add;
|
|
}
|
|
z->start[z->top]=x;
|
|
z->top++;
|
|
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
void zinit(zhan *z){ //创建栈 要传入啥呢?和定义zhan的东西好像一样。
|
|
z->add=2;
|
|
z->top=0;
|
|
z->length=10; //现在定义好了,要申请内存
|
|
z->start=(int*)malloc((z->length)*sizeof(int));
|
|
|
|
|
|
|
|
}
|
|
|
|
int zreduce(zhan *z,int *a){ //实现拿出去数据。这里 因为要把数据带着,要么 return ,要么用指针
|
|
if(z->top==0){
|
|
printf("没东西了,要爆了");
|
|
return 1 ;
|
|
}
|
|
|
|
z->top--;
|
|
*a=z->start[z->top];
|
|
return 0;
|
|
|
|
}
|
|
|
|
void zfree(zhan *z){
|
|
free(z->start);
|
|
|
|
}
|
|
|
|
|