您的位置:首页 > 编程语言 > C语言/C++

使用链表实现栈(C语言)

2017-04-02 16:26 281 查看
下边的实现,默认在链栈中设置一个头结点,用于指向栈的第一个元素

链栈结构体定义

typedef char DataType;
typedef struct node{
DataType data;
struct node *next;
}LStackNode,*LinkStack;
1
2
3
4
5
1
2
3
4
5

链栈算法实现

void InitStack(LinkStack *top){
// 为头结点分配存储单元
if((*top=(LinkStack)malloc(sizeof(LStackNode)))==NULL){
exit(-1);
}
// 将头结点的指针域置为空
(*top)->next = NULL;
}
// 判断栈是否为空
int StackEmpty(LinkStack top){
if(top->next == NULL){
return 1;
}else{
return 0;
}
}
// 将元素入栈:需要为入栈的结点分配内存
int PushStack(LinkStack top,DataType e){
LStackNode *p;
if((p=(LStackNode*)malloc(sizeof(LStackNode)))==NULL){
printf("内存分配失败\n");
return 0;
}
p->data = e;
p->next = top->next;
top->next = p;
return 1;
}
// 将元素出栈:需要释放结点空间
int PopStack(LinkStack top,DataType *e){
LStackNode *p;
p = top->next;
if(!p){
printf("栈已空\n");
return 0;
}
top->next = p->next;
*e = p->data;
free(p);
return 1;
}
// 取栈顶元素:需要对边界做判断(栈是否为空)
int GetTop(LinkStack top,DataType *e){
LStackNode *p;
p = top->next;
if(!p){
printf("栈已空\n");
return 0;
}
*e = p->data;
return 1;
}
// 获取栈长度:因为需要头结点,依次寻找下一个结点,所以时间复杂度为:O(n)
int StackLength(LinkStack top){
int i=0;
LStackNode *p;
p = top;
if(p->next!=NULL){
p = p->next;
i++;
}
return i;
}
// 销毁链栈:需要释放动态分配的结点空间
void DestoryStack(LinkStack top){
LStackNode *p,*q;
p = top;
while(!p){
q = p;
p = p->next;
free(q);
}
}
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
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

应用

1 进制转换:例如十进制转八进制,不断除以8,保存余数,直到商为0,从下往上取余数。可以使用栈保存余数,再依次取出 

2 括号配对:假如是括号的左边,就入栈;当遇到括号的右边,就出栈一个元素,比较是否配对;配对就继续上一步,不配对就退出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表