栈测试代码笔记如下:
1 #include<stdio.h> 2 #include<string.h> 3 #include <stdlib.h> 4 #define SIZE 10 5 6 typedef struct Stack 7 { 8 char *name[SIZE]; //栈的容量 9 10 int top; //栈顶 11 }STACK,*PSTACK; // struct Stack * 12 13 //1.初始化栈 14 void Init_Stack(PSTACK S) //这里只需要一个参数 把栈传进来初始化 15 { 16 S->top = 0; //栈顶是从第0个下标开始 17 18 for (int i = 0; i < SIZE; i++) 19 { 20 S->name[i] = NULL; 21 } 22 } 23 24 //2.入栈操作 25 void Push_Stack(PSTACK S, char *data) //参数1:表明插入的栈 参数2: 要插入的数据 26 { 27 //2.1 判断栈是否是满的 如果是满的就退出 满了你还要插入 会报错 28 if (S->top >= SIZE) 29 { 30 printf("栈满!无法继续插入 "); 31 return; //结束这个函数. 32 } 33 34 //2.2 栈没有满 35 //S->name[S->top] = data; // 这样写有一个bug data是一个堆内存 这是浅拷贝问题 会造成内存泄漏. C++讲到 36 int len = strlen(data); //我随便申请一个内存不可以吗? 后果:会浪费 或者不够用 1W 现在只需要暂用10个内存大小 37 S->name[S->top] = (char *)malloc(sizeof(char)*len + 1); //name它是一个指针数组 申请多大要按照你传进来的参数定制 38 //+1 是防止斜杠0 39 strcpy(S->name[S->top], data); //字符串拷贝函数 40 S->top++; //在执行插入操作之后 我的top要+1 41 } 42 43 //3.获取栈顶元素 44 char * GetStackTop(PSTACK S) 45 { 46 return S->name[S->top-1]; 47 } 48 49 //4. 出栈 50 void Pop_Stack(PSTACK S) 51 { 52 //这里我就不判断 判断是不是空 53 54 free(S->name[S->top-1]); 55 56 S->top--; 57 } 58 59 //5.判断是不是空的栈 60 int Stack_Empty(PSTACK S) //函数返回1 说明什么栈是空的 如果返回0说明栈是有元素的 61 { 62 return S->top == 0; //等于0说明栈是空的 63 } 64 65 int main() 66 { 67 STACK MyStack; //定义一个栈 68 Init_Stack(&MyStack); //调用初始化函数给栈初始化 69 //入栈 70 Push_Stack(&MyStack, "张三"); 71 Push_Stack(&MyStack, "李四"); 72 Push_Stack(&MyStack, "驴"); 73 Push_Stack(&MyStack, "王麻子"); 74 Push_Stack(&MyStack, "Danny"); 75 Push_Stack(&MyStack, "小小"); 76 // 出栈 77 while (!Stack_Empty(&MyStack)) //如果栈不是空的 就一直循环 78 { 79 printf(" %s ", GetStackTop(&MyStack)); //打印栈顶元素 如果都不出栈 栈顶是不是永远都是广广 80 //在这里要进行出栈操作 81 Pop_Stack(&MyStack); //都出栈完之后 栈为空 结束循环 82 } 83 printf(" "); 84 return 0; 85 }
2019-03-31 21:04:47