一起talk C栗子吧(第十六回:C语言实例--栈一)
各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例。闲话休提, 言归正转。让我们一起talk C栗子吧!
看官们,上一回中咱们说的是双向链表的例子,这一回咱们说的例子是:栈。
什么是栈?我们听过龙门客栈,你这个是哪家客栈?我还没有说,台下已经有客官在问了。看官们,栈是 类似我们在前面几回中说过的链表,它也是用来存放数据的一种抽象的数据结构。因为比较抽象,咱们还 是举个现实生活中的例子来说明吧。我们出去旅游时通常拿一个行李箱存放自己的物品,比如衣服,鞋子 电脑,相机等。出发前,我们会把这些东西依次放到行李箱中,首先会把不容易压坏的物品放到箱底,比 如衣服。然后把容易压坏的物品放到上面,比如电脑和相机。当我们到达目的地时,会取出行李箱中的物 品。首先拿出放在箱子上面的电脑和相机,最后拿出放在箱子底部的衣服。大家看看,拿出物品的顺序和 存放物品的顺序正好相反。最后放进去的电脑和相机等易压碎的物品最先拿出来,最先放进去的衣服等不 易压碎的物品最后拿出来。这个行李箱就好比一个存放数据的栈,箱子里面的物品好比数据,从箱子里拿 物品好比操作数据,拿物品要先拿最后存放的物品,操作数据也要先操作最后放到栈中的数据。就是说最 先存放到栈中的数据最后被拿出。这便是栈的特点:先进后出。
看官们,和链表一样,栈也有两种实现方式:顺序存放和链式存放。我们会分别举例子说明。栈有两个基 本的操作:出栈和入栈。入栈就是把数据存放到栈中,出栈就是把数据从栈中拿出来。入栈和出栈这两个 操作要符合栈“先进后出”的特点。
看官们,详细的代码如下,大家可以参考。关于代码中有一些需要注意的地方和大家说一下:
- 1.栈的顺序存储是通过一个全局数组实现的,栈的大小就也就是数组的长度,可以自己定义。
- 2.入栈时要确认栈是否已经満了,不然会有溢出。我在代码中多放了一个空间可以避免溢出。
- 3.出栈时要确认栈是否已经空了,不然会有溢出。我在代码中通过多放了一个变量size可以避免溢出。
1 /* **************************
2 * Head file of Stack
3 * *************************/
4 #ifndef STACK_H
5 #define STACK_H
6
7 #include<stdio.h>
8 #include<stdlib.h>
9
10 #define SUCCESS 0
11 #define FAILE 1
12
13 #define LEN 5 //栈的长度先定义为5,需要时可自行修改
14
15 typedef int StackElmt; //把int当作栈中元素的类型,实际中可以使用其它的类型或者自己定义一个List类型
16 typedef struct _Stack{
17 StackElmt *base;
18 StackElmt *top;
19 int size;
20 }Stack;
21
22 StackElmt STACK[LEN+1] = {0}; //顺序存储方式的栈,防止数组越界,最后一个位置不放元素
23
24 //声明函数原型,这里有入栈和出栈操的函数
25 int StackInit(Stack *s);
26 int StackPrint(Stack *s);
27 int StackPush(Stack *s, StackElmt e);
28 int StackPop(Stack *s, StackElmt *e);
29
30 #endif /*STACK_H*/
1 /* **************************
2 * Soure file of Stack
3 * *************************/
4
5 #include"Stack1.h"
6
7 //实现List的函数,为了方便,放到了主函数所在的文件中,最好是单独建立实现函数的源文件
8 //初始化中栈
9 int StackInit(Stack *s)
10 {
11 if(NULL == s)
12 return FAILE;
13
14 s->top = s->base = &STACK[0];
15 s->size = 0;
16
17 }
18 //输出栈中存放的元素
19 int StackPrint(Stack *s)
20 {
21 int index = 0;
22
23 if(NULL == s)
24 return FAILE;
25
26 if(s->size == 0)
27 {
28 printf("the Stack is empty,there is not any element \n");
29 return FAILE;
30 }
31
32 while(index < (s->size))
33 {
34 printf("%d ",*((s->base)+index) );
35 index++;
36 }
37
38 printf("\n ");
39
40 return SUCCESS;
41 }
42
43 //入栈函数,top指向栈顶,先把元素入栈,然后向栈顶移动一位
44 int StackPush(Stack *s, StackElmt e)
45 {
46 if(NULL == s)
47 return FAILE;
48
49 if(s->size >= LEN)
50 {
51 printf("the Stack is full \n");
52 return FAILE;
53 }
54
55 *(s->top) = e;
56 (s->top)++;
57 (s->size)++;
58
59 return SUCCESS;
60 }
61
62 //出栈函数,top先向栈底移到一位,然后移出当前它所指向的元素
63 int StackPop(Stack *s, StackElmt *e)
64 {
65 if(NULL == s)
66 return FAILE;
67
68 if(s->size == 0)
69 {
70 printf("the Stack is empty \n");
71 return FAILE;
72 }
73
74 (s->top)--;
75 *e = *(s->top);
76 (s->size)--;
77
78 return SUCCESS;
79 }
80
81
82 int main()
83 {
84 int i = 0;
85 StackElmt e = 0;
86 Stack stack ;
87
88 if( SUCCESS == StackInit(&stack) )
89 StackPrint(&stack);
90
91 StackPush(&stack,7);
92 StackPrint(&stack);
93
94 StackPop(&stack,&e);
95 printf("%d is poped \n",e);
96
97 while(i++ < LEN+5)
98 {
99 if( SUCCESS == StackPush(&stack,i) )
100 printf("%d is pushed \n",i);
101 }
102
103 while(i-- > 0)
104 {
105 if( SUCCESS == StackPop(&stack,&e) )
106 printf("%d is poped \n",e);
107 }
108
109 }
各位看官,关于栈的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。
上一篇: 第十五回:C语言...
下一篇: 第十七回:C语言...