数据结构学习第六天
17:07:38 2019-08-21
学习
18:11:59 2019-08-21
完善了对栈 队列的测试
栈的数组实现
StackInArray.h
1 #ifndef _STACK_IN_ARRAY_H 2 #define _STACK_IN_ARRAY_H 3 #define Empty -1 4 struct AStack; 5 typedef struct AStack* Stack; 6 int IsEmpty(Stack S); 7 int IsFull(Stack S); 8 Stack CreatAStack(int MaxSize); 9 void DisposeAStack(Stack S); 10 void MakeEmpty(Stack S); 11 void Push(int Element, Stack S); 12 int Top(Stack S); 13 void Pop(Stack S); 14 int TopAndPop(Stack S); 15 #endif // !_STACK_IN_ARRAY_H
StackInArray.c
1 #include"StackInArray.h" 2 #include<malloc.h> 3 #include<stdio.h> 4 struct AStack 5 { 6 int Capacity; 7 int TopOfStack; 8 int* Array; 9 }; 10 int IsEmpty(Stack S) 11 { 12 return S->TopOfStack == Empty; 13 } 14 15 int IsFull(Stack S) 16 { 17 return S->TopOfStack == (S->Capacity - 1); 18 } 19 20 Stack CreatAStack(int MaxSize) 21 { 22 Stack S = (Stack)malloc(sizeof(AStack)); 23 S->Capacity = MaxSize; 24 S->Array = (int*)malloc(sizeof(int) * S->Capacity); 25 MakeEmpty(S); 26 return S; 27 } 28 29 void DisposeAStack(Stack S) 30 { 31 if (S) 32 { 33 free(S->Array); 34 free(S); 35 } 36 } 37 38 void MakeEmpty(Stack S) 39 { 40 S->TopOfStack = Empty; 41 } 42 43 void Push(int Element, Stack S) 44 { 45 if (IsFull(S)) 46 { 47 printf("out of space\n"); 48 return; 49 } 50 else 51 { 52 S->Array[++S->TopOfStack] = Element; 53 } 54 } 55 56 int Top(Stack S) 57 { 58 if (IsEmpty(S)) 59 { 60 printf("stack is empty\n"); 61 return -1; 62 } 63 else 64 { 65 return S->Array[S->TopOfStack]; 66 } 67 } 68 69 void Pop(Stack S) 70 { 71 if (IsEmpty(S)) 72 { 73 printf("stack is empty\n"); 74 return; 75 } 76 else 77 { 78 S->TopOfStack--; 79 } 80 } 81 82 int TopAndPop(Stack S) 83 { 84 if (IsEmpty(S)) 85 { 86 printf("stack is empty\n"); 87 return -1; 88 } 89 else 90 { 91 /*int Element = S->Array[S->TopOfStack]; 92 Pop(S); 93 return Element;*/ 94 return S->Array[S->TopOfStack--]; 95 } 96 }
main.c
1 #include<stdio.h> 2 #include"StackInArray.h" 3 4 int main() 5 { 6 Stack S; 7 S = CreatAStack(20); 8 printf("%10d %10d\n", IsEmpty(S), IsFull(S)); 9 Push(25, S); 10 printf("%10d %10d\n", IsEmpty(S), IsFull(S)); 11 printf("%10d\n", Top(S)); 12 Push(30, S); 13 printf("%10d ",TopAndPop(S)); 14 printf("%10d\n", Top(S)); 15 Pop(S); 16 printf("%10d\n", IsEmpty(S)); 17 Pop(S); 18 return 0; 19 }
写的过程中注意到了 printf 对参数压栈顺序
查了下资料 有__cdecl 这样的一个默认的调用约定(对c和c++来说都是) 表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。
我用的ide是vs2019
调试时会发现 先进入 fun2() 再进入fun1()
函数读参数也是如同进栈一般
先进入fun2() 返回值为1 把1进栈
再进入fun1() 返回值为2 把2进栈
那么出栈后是2 1