功能模块设计

基于C语言实现的链栈,包含以下功能模块:

  • 初始化链栈
  • 入栈
  • 出栈
  • 判断栈是否为空
  • 获取链栈长度
  • 取栈顶元素
  • 遍历链栈
  • 链栈置空

完整代码

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//链栈的实现及常用操作测试
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//链栈的数据结构
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
} Node, * LinkStack;

//1.初始化链栈
LinkStack InitLinkStack();
//2.判断链栈是否为空
int StackEmpty(LinkStack S);
//3.获取链栈长度
int StackLength(LinkStack S);
//4.入栈
int PushLinkStack(LinkStack S, ElemType e);
//5.出栈
int PopLinkStack(LinkStack S, ElemType* e);
//6.遍历栈(从栈顶到栈底)
void PrintLinkStack(LinkStack S);
//7.链栈置空
void ClearLinkStack(LinkStack S);
//8.取栈顶元素
int GetTopLinkStack(LinkStack S, ElemType* e);

//主函数
int main(void)
{
ElemType e;
printf("初始化链栈成功!\n");
LinkStack S = InitLinkStack();
int i = 0;
printf("\n执行9次入栈操作!\n");
for (i = 0; i < 9; i++)
{
PushLinkStack(S, i + 1);
}
printf("执行完毕!当前栈长度为:%d\n打印当前栈:", StackLength(S));
PrintLinkStack(S);
printf("\n执行4次出栈操作!\n");
for (i = 0; i < 4; i++)
{
PopLinkStack(S, &e);
printf("第%d次:栈顶元素%d出栈成功!\n", i + 1, e);
}
printf("执行完毕!当前栈长度为:%d\n打印当前栈:", StackLength(S));
PrintLinkStack(S);
GetTopLinkStack(S, &e);
printf("\n执行取栈顶元素操作:当前栈顶元素为:%d\n", e);
printf("\n执行清空栈操作!\n");
ClearLinkStack(S);
if (StackEmpty(S)) printf("执行完毕!当前栈为空!\n");
else printf("清空栈失败!\n");
return 0;
}

//功能1 初始化链栈(带头结点的链栈)
LinkStack InitLinkStack()
{
LinkStack S = (LinkStack)malloc(sizeof(Node));
S->next = NULL;
return S;
}

//功能2 判断链栈是否为空
int StackEmpty(LinkStack S)
{
if (S == NULL) return 0;
return S->next == NULL;
}

//功能3 获取链栈长度
int StackLength(LinkStack S)
{
int len = 0;
if (StackEmpty(S)) return 0;
//带头结点的链栈要先移动一下
Node* p = S->next;
while (p != NULL)
{
len++;
p = p->next;
}
return len;
}

//功能4 入栈
int PushLinkStack(LinkStack S, ElemType e)
{
//分配入栈结点
Node* newNode = (Node*)malloc(sizeof(Node));
//节点分配失败
if (!newNode) return 0;
//使用头插法
newNode->data = e;
newNode->next = S->next;
S->next = newNode;
//入栈成功则返回1
return 1;
}

//功能5 出栈
int PopLinkStack(LinkStack S, ElemType* e)
{
//栈空则出栈失败
if (StackEmpty(S)) return 0;
//访问栈顶结点
Node* top = S->next;
//取出栈顶元素
*e = top->data;
S->next = top->next;
//释放栈顶空间
free(top);
//出栈成功则返回1
return 1;
}

//功能6 遍历栈(从栈顶到栈底)
void PrintLinkStack(LinkStack S)
{
//遍历时从首元素节点开始
Node* p = S->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}

//功能7 链栈置空
void ClearLinkStack(LinkStack S)
{
Node* p = S->next;
while (p)
{
Node* q = p;
p = p->next;
free(q);
}
S->next = NULL;
}

//功能8 取栈顶元素
int GetTopLinkStack(LinkStack S, ElemType* e)
{
//如果为空栈则返回0,代表取栈顶元素失败
if (StackEmpty(S)) return 0;
else
{
*e = S->next->data;
//返回1代表取栈顶元素成功,栈顶元素保存在e中
return 1;
}
}

运行方法

  1. 新建一个cpp文件,命名为”main.cpp”。
  2. 将完整代码复制粘贴至”main.cpp”中。
  3. 利用Dev C++运行”main.cpp”即可。

运行结果

运行结果