数据结构学习第六天

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
View Code

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 }
View Code

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 }
View Code

 

写的过程中注意到了 printf 对参数压栈顺序

查了下资料 有__cdecl 这样的一个默认的调用约定(对c和c++来说都是)  表示C语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。

我用的ide是vs2019

调试时会发现 先进入 fun2() 再进入fun1()  

 函数读参数也是如同进栈一般  

先进入fun2() 返回值为1 把1进栈

再进入fun1() 返回值为2 把2进栈  

那么出栈后是2 1

 

posted @ 2019-08-22 01:32  57one  阅读(111)  评论(0编辑  收藏  举报