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
//栈
#include <stdio.h>
#include <stdlib.h>


typedef struct Node //定义栈结点的结构体
{
int data;
struct Node *next;
} Node;


Node *initStack() //初始化栈
{
Node *L = (Node *)malloc(sizeof(Node)); //为头结点分配动态内存空间
L->data = 0; //data初始化
L->next = NULL; //头结点next指向NULL
return L; //返回头结点的地址
}


void push(Node *L, int data) //入栈
{
Node *node = (Node *)malloc(sizeof(Node)); //为新结点分配动态内存空间
node->data = data; //为data赋值
node->next = L->next; //将头结点的next的值 赋值给 新结点的next
L->next = node; //将新结点的地址 赋值给 头结点的next
L->data++; //头结点data++
}


int pop(Node *L) //出栈
{
if (L->data == 0) //判断栈是否为空栈
{
return 0; //是空栈则返回 1
}
else
{
Node *node = L->next; //将头结点的next的值 赋值给 node
int data = node->data; //将头结点的下一结点的data 赋值给 data
L->next = node->next; //将头结点的下一结点的next 赋值给头结点的next
free(node); //释放头结点的下一结点的动态内存空间
L->data--; //将头结点的data--
return data; //返回取出的值
}
}


int isEmpty(Node *L) //判断是否为空栈
{
if (L->data == 0 || L->next == NULL) //判断头结点的data == 0 或者 头结点的next的值为NULL
{
return 1; //返回 1,代表此栈为空栈
}
else
{
return 0; //返回 0,代表此栈不是空栈
}
}


void printStack(Node *stack) //打印栈
{
Node *node = stack->next; //将头结点的next的值 赋值给node
while (node) //判断node是否为NULL
{
printf("%d -> ", node->data); //打印node的data
node = node->next; //更新node
}
printf("NULL\n");
}


int main() {
Node *stack = initStack(); //创建栈
push(stack, 1); //1 入栈
push(stack, 2); //2 入栈
push(stack, 3); //3 入栈
push(stack, 4); //4 入栈
printStack(stack); //打印栈
printf("pop = %d\n", pop(stack)); //出战
printStack(stack); //打印栈
}