一、链式栈

链式栈管理结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef int Datatype;


//链式栈节点
struct Node
{
Datatype data;
struct Node *next;
};

// 链式栈管理结构体
typedef struct link_stack
{
int size; //元素个数
struct Node *top; //栈顶
}linkStack;

1、初始化栈

1
2
3
4
5
6
7
8
9
10
11
12
// 初始化栈
linkStack *init_stack(void)
{
linkStack *s = malloc(sizeof(linkStack));
if(s != NULL)
{
s->size = 0;
s->top = NULL;
}

return s;
}

2、判断栈空

1
2
3
4
5
6
// 判断栈空
bool is_empty(linkStack *s)
{
// return s->top == NULL;
return s->size == 0;
}

3、入栈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 入栈
bool push(linkStack *s, Datatype data)
{
struct Node *new = malloc(sizeof(struct Node));
if(new == NULL)
return false;

new->data = data;

// 把节点添加到栈顶
new->next = s->top;
s->top = new; //更新栈顶

s->size++; //节点加1

return true;
}

4、出栈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 出栈
bool pop(linkStack *s, Datatype *data)
{
if(is_empty(s)) //栈空,没有元素可出
return false;

// 把栈顶元素的值拿到
*data = s->top->data;

// 把栈顶元素释放掉
struct Node *tmp = s->top;
s->top = s->top->next;
s->size--; //节点减1

free(tmp); // 释放掉已经出栈的元素

return true;
}

5、获得栈顶元素

1
2
3
4
5
6
7
8
9
10
11
// 获得栈顶元素
bool top(linkStack *s, Datatype *data)
{
if(is_empty(s)) //栈空,没有元素可出
return false;

// 把栈顶元素的值拿到
*data = s->top->data;

return true;
}

二、接口汇总

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
typedef int Datatype;


//链式栈节点
struct Node
{
Datatype data;
struct Node *next;
};

// 链式栈管理结构体
typedef struct link_stack
{
int size; //元素个数
struct Node *top; //栈顶
}linkStack;


// 初始化栈
linkStack *init_stack(void)
{
linkStack *s = malloc(sizeof(linkStack));
if(s != NULL)
{
s->size = 0;
s->top = NULL;
}

return s;
}


// 判断栈空
bool is_empty(linkStack *s)
{
// return s->top == NULL;
return s->size == 0;
}


// 入栈
bool push(linkStack *s, Datatype data)
{
struct Node *new = malloc(sizeof(struct Node));
if(new == NULL)
return false;

new->data = data;

// 把节点添加到栈顶
new->next = s->top;
s->top = new; //更新栈顶

s->size++; //节点加1

return true;
}

// 出栈
bool pop(linkStack *s, Datatype *data)
{
if(is_empty(s)) //栈空,没有元素可出
return false;

// 把栈顶元素的值拿到
*data = s->top->data;

// 把栈顶元素释放掉
struct Node *tmp = s->top;
s->top = s->top->next;
s->size--; //节点减1

free(tmp); // 释放掉已经出栈的元素

return true;
}

// 获得栈顶元素
bool top(linkStack *s, Datatype *data)
{
if(is_empty(s)) //栈空,没有元素可出
return false;

// 把栈顶元素的值拿到
*data = s->top->data;

return true;
}