数据结构学习第六天

Posted 57one

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构学习第六天相关的知识,希望对你有一定的参考价值。

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

技术图片

 

以上是关于数据结构学习第六天的主要内容,如果未能解决你的问题,请参考以下文章

大数据学习第六天

python 学习的第六天 数据的预处理

学习数据结构的第六天(包括一些还没学习的,指导之后学习的要点)

java学习第六天

学习python的第六天

学习java的第六天