使用链表实现栈(C语言)
2017-04-02 16:26
281 查看
下边的实现,默认在链栈中设置一个头结点,用于指向栈的第一个元素
2
3
4
5
1
2
3
4
5
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
2 括号配对:假如是括号的左边,就入栈;当遇到括号的右边,就出栈一个元素,比较是否配对;配对就继续上一步,不配对就退出
链栈结构体定义
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 括号配对:假如是括号的左边,就入栈;当遇到括号的右边,就出栈一个元素,比较是否配对;配对就继续上一步,不配对就退出
相关文章推荐
- 使用C语言实现“泛型”链表
- c语言双向循环链表实现-使用内核链表
- 使用C语言实现“泛型”链表
- C语言使用链表实现火车票售票系统未完成
- <C语言>使用一个二维数组实现学生姓名管理系统,要求不能使用链表
- C语言实现使用带头结点的单链表来构造栈结构
- C语言使用链表实现学生信息管理系统
- C语言双向链表实现根据使用频率安排元素位置的功能实例代码
- 如何使用c语言实现双向链表的插入删除操作
- C语言:使用链表实现的可变长度字符串处理函数
- 使用C语言实现“泛型”链表
- c语言使用链表编写一个可以实现班级学生管理系统,增加,删除,修改学生信息
- c语言实现正序链表的创建(不使用头结点)
- 使用C语言实现单链表
- 链表的C语言实现之动态内存分配(转载)
- Berkeley db 中queue算法的使用(c语言实现)
- C语言实现数据结构中的循环链表
- linux下使用Freetds 连接MS SqlServer 2000 (C语言实现)
- C语言实现线性结构创建动态链表的学习心得(一)
- C语言使用openSSL库DES模块实现加密功能详解