栈的实现

Posted laizhenghong2012

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的实现相关的知识,希望对你有一定的参考价值。

一 写在开头

1.1 本文内容

数据结构栈的实现。

 

二 栈的实现

不多说了,请直接看代码。

 1 // stack.h
 2 
 3 /* 为了使用bool */
 4 #include <stdbool.h>
 5 
 6 #ifndef _H_STACK_H
 7 #define _H_STACK_H
 8 
 9 /* 数据类型 */
10 typedef char type;
11 
12 /* 栈结点 */
13 typedef struct tsNode
14 {
15     type data;
16     struct tsNode *next;
17 } Node;
18 
19 /* 栈类型 */
20 typedef struct tsStack
21 {
22     Node *top;
23     unsigned int size;
24 } Stack;
25 
26 /* 初始化Stack */
27 Stack *
28 StackInit(void);
29 
30 /* 判断栈是否为空。为空返回true,否则返回false */
31 bool
32 IsEmpty(Stack *);
33 
34 /* 入栈操作 */
35 void
36 StackPush(Stack *, type);
37 
38 /* 出栈操作 */
39 type
40 StackPop(Stack *);
41 
42 /* 取得栈顶元素 */
43 type
44 GetTop(Stack *);
45 #endif

 

 1 // stack.c
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include <stdbool.h>
 6 #include "stack.h"
 7 
 8 /* 功能:栈初始化
 9  * 输入:无
10  * 输出:一个指向Stack型的指针,指针所指对象已被初始化
11  */
12 Stack *
13 StackInit(void)
14 {
15     Stack *s = NULL;
16 
17     s = (Stack *)malloc(sizeof(Stack));
18     if (s == NULL)
19         exit(EXIT_FAILURE);
20     s->top = NULL;
21     s->size = 0;
22     return s;
23 }
24 
25 /* 功能:判断栈是否为空。为空返回true,否则返回false
26  * 输入:一个指向Stack型的指针
27  * 输出:一个bool型变量
28  */
29 bool
30 IsEmpty(Stack *s)
31 {
32     /* s未被初始化 */
33     if (s == NULL)
34         exit(EXIT_FAILURE);
35     else
36         return ((s->size) == 0);
37 }
38 
39 /* 功能:入栈操作
40  * 输入:一个指向Stack型的指针,一个type型待入栈变量
41  * 输出:无
42  */
43 void
44 StackPush(Stack *s, type x)
45 {
46     Node *temp = (Node *)malloc(sizeof(Node));
47 
48     if (temp == NULL)
49         exit(EXIT_FAILURE);
50     temp->data = x;
51 
52     /* 若s未被初始化 */
53     if (s == NULL)
54         exit(EXIT_FAILURE);
55     temp->next = s->top;
56     s->top = temp;
57     s->size = (s->size) + 1;
58 }
59 
60 /* 功能:出栈操作
61  * 输入:一个指向Stack型的指针
62  * 输出:被出栈的元素
63  */
64 type
65 StackPop(Stack *s)
66 {
67     Node *p = NULL;
68     type r;
69 
70     if (IsEmpty(s))
71         exit(EXIT_FAILURE);
72     p = s->top->next;
73     r = s->top->data;
74     free(s->top);
75     s->top = p;
76     s->size = (s->size) - 1;
77     return r;
78 }
79 
80 /* 功能:返回栈顶元素
81  * 输入:一个指向Stack型的指针
82  * 输出:栈顶元素
83  */
84 type
85 GetTop(Stack *s)
86 {
87     if (IsEmpty(s))
88         exit(EXIT_FAILURE);
89     return s->top->data;
90 }

 

 1 #include <stdio.h>
 2 #include "stack.h"
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     Stack *s = StackInit();
 7 
 8     /* test passed
 9     printf("s->top = %p\n", s->top);
10     printf("s->size = %u\n", s->size);
11     printf("s is empty: ");
12     IsEmpty(s) ? printf("yes\n") : printf("no\n");
13     */
14 
15     /* test passed
16     StackPush(s, ‘h‘);
17     StackPush(s, ‘e‘);
18     StackPush(s, ‘l‘);
19     StackPush(s, ‘l‘);
20     StackPush(s, ‘o‘);
21     printf("s is empty: ");
22     IsEmpty(s) ? printf("yes\n") : printf("no\n");
23     printf("s->size = %u\n", s->size);
24 
25     while ((s->size) > 0)
26     {
27         printf("%c\n", StackPop(s));
28     }
29     printf("s is empty: ");
30     IsEmpty(s) ? printf("yes\n") : printf("no\n");
31     */
32 
33     /* test passed
34     StackPush(s, ‘h‘);
35     StackPush(s, ‘e‘);
36     StackPush(s, ‘l‘);
37     StackPush(s, ‘l‘);
38     StackPush(s, ‘o‘);
39     while (IsEmpty(s) == false)
40     {
41         printf("%c\n", GetTop(s));
42         StackPop(s);
43     }
44     printf("s is empty: ");
45     IsEmpty(s) ? printf("yes\n") : printf("no\n");
46     */
47 
48     // 栈的内存组织情况 - pass
49     /* 当s为空栈时内存组织情况
50      * p s - 0x602010
51      * p s->top - 0x0
52      * p s->size - 0
53      */
54     
55     StackPush(s, h);
56     /* 当s中有一个值为‘h‘的元素时内存组织情况
57      * p s - 0x602010
58      * p s->top - 0x602030
59      * p s->size - 1
60      * p s->top->data - ‘h‘
61      * p s->top->next - 0x0
62      */
63 
64     StackPush(s, e);
65     /* 当s中有两个元素时内存组织情况
66      * p s - 0x602010
67      * p s->top - 0x602050
68      * p s->size - 2
69      * p s->top->data - ‘e‘
70      * p s->top->next - 0x602030
71      * p s->top->next->data - ‘h‘
72      * p s->top->next->next - 0x0
73      */
74 
75     StackPop(s);
76     /* 当将栈顶元素弹出后内存组织情况
77      * p s - 0x602010
78      * p s->top - 0x602030
79      * p s->size - 1
80      * p s->top->data - ‘h‘
81      * p s->top->next - 0x0
82      */
83     
84     return 0;
85 }

注意:为了成功编译包含了stack.h的主程序,你需要使用下面的命令。也即必须将stack.c编译成目标文件,供链接程序链接使用,否则链接程序将报错。不同于C标准库的使用,因为C标准库默认采用动态链接的方式,所用标准库中的函数均已经被编译好了,放在特定的目录下面,链接程序只需去目录中找相对应的目标文件即可。这里我们必须将stack.c编译成目标文件,供主程序链接时使用。

gcc main.c stack.c

 

以上是关于栈的实现的主要内容,如果未能解决你的问题,请参考以下文章

栈的基本实现代码

数据结构复习代码——栈的顺序实现以及一些基本操作

栈的实现代码

栈的实现原理

数据结构基础学习——栈的概念及代码实现

链栈的基本实现