『代码』··By/蜜汁炒酸奶

链表实现栈的动态顺序存储实现—C语言

头文件

ElemType.h

/***
*ElemType.h - ElemType的定义
*
****/

#ifndef ELEMTYPE_H
#define ELEMTYPE_H

typedef int ElemType;

int  compare(ElemType x, ElemType y);
void visit(ElemType e);

#endif /* ELEMTYPE_H */
1
2
3
4
5
6
7
8
9
10
11
12
13
14

DynaSeqStack.h

/***
*DynaSeqStack.h - 动态顺序栈的定义
*
****/

#if !defined(DYNASEQSTACK_H)
#define DYNASEQSTACK_H

#include "ElemType.h"

/*------------------------------------------------------------
// 栈结构的定义
------------------------------------------------------------*/
typedef struct Stack
{
	ElemType *base;				// 栈基址
	ElemType *top;				// 栈顶
	int stacksize;				// 栈存储空间的尺寸
} SqStack;

/*------------------------------------------------------------
// 栈的基本操作
------------------------------------------------------------*/

bool InitStack(SqStack *S);
void DestroyStack(SqStack *S);
bool StackEmpty(SqStack S);
int  StackLength(SqStack S);
bool GetTop(SqStack S, ElemType *e);
void StackTraverse(SqStack S, void (*fp)(ElemType));
bool Push(SqStack *S, ElemType e);
bool Pop(SqStack *S, ElemType *e);

#endif /* DYNASEQSTACK_H */
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

主函数文件

Lab.cpp

#include <stdio.h>
#include <stdlib.h>
#include "DynaSeqStack.h"

const int STACK_INIT_SIZE = 100; 	// 初始分配的长度
const int STACKINCREMENT  = 10;		// 分配内存的增量


int main()
{
	SqStack S;

    InitStack(&S);
	Push(&S,12);
	system("pause");
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

实现函数文件

ElemType.cpp

/***
*ElemType.cpp - ElemType的实现
*
****/

#include <stdio.h>
#include "ElemType.h"

int compare(ElemType x, ElemType y)
{
	return(x-y);
}

void visit(ElemType e)
{
	printf("%dn", e);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

DynaSeqStack.cpp

/***
*DynaSeqStack.cpp - 动态顺序栈,即栈的动态顺序存储实现
*
*
*题目:实验3-1 栈的动态顺序存储实现
*
*
*
*
****/

#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#include "DynaSeqStack.h"

const int STACK_INIT_SIZE = 100;	// 初始分配的长度
const int STACKINCREMENT  = 10;		// 分配内存的增量

/*------------------------------------------------------------
操作目的:	初始化栈
初始条件:	无
操作结果:	构造一个空的栈
函数参数:
		SqStack *S	待初始化的栈
返回值:
		bool		操作是否成功
------------------------------------------------------------*/
bool InitStack(SqStack *S)
{
     S->base = S->top = (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
	 if (!S->base)
	 {
		 return false;
	 }
	S->stacksize = STACK_INIT_SIZE;
	return true;
}

/*------------------------------------------------------------
操作目的:	销毁栈
初始条件:	栈S已存在
操作结果:	销毁栈S
函数参数:
		SqStack *S	待销毁的栈
返回值:
		无
------------------------------------------------------------*/
void DestroyStack(SqStack *S)
{
	free(S->base);
	S->top = S->base = NULL;
}

/*------------------------------------------------------------
操作目的:	判断栈是否为空
初始条件:	栈S已存在
操作结果:	若S为空栈,则返回true,否则返回false
函数参数:
		SqStack S	待判断的栈
返回值:
		bool		是否为空
------------------------------------------------------------*/
bool StackEmpty(SqStack S)
{
	if (S.base == S.top)
	{
        return true;
	}
	return false;
}

/*------------------------------------------------------------
操作目的:	得到栈的长度
初始条件:	栈S已存在
操作结果:	返回S中数据元素的个数
函数参数:
		SqStack S	栈S
返回值:
		int			数据元素的个数
------------------------------------------------------------*/
int StackLength(SqStack S)
{

	return (S.top - S.base);
;
}

/*------------------------------------------------------------
操作目的:	得到栈顶元素
初始条件:	栈S已存在
操作结果:	用e返回栈顶元素
函数参数:
		SqStack S	栈S
		ElemType *e	栈顶元素的值
返回值:
		bool		操作是否成功
------------------------------------------------------------*/
bool GetTop(SqStack S, ElemType *e)
{
	if (!S.base)
	{
		*e = *(S.top-1);
		return true;
	}
	return false;
}

/*------------------------------------------------------------
操作目的:	遍历栈
初始条件:	栈S已存在
操作结果:	依次对S的每个元素调用函数fp
函数参数:
		SqStack S		栈S
		void (*fp)()	访问每个数据元素的函数指针
返回值:
		无
------------------------------------------------------------*/
void StackTraverse(SqStack S, void (*fp)(ElemType))
{
	for (;S.base<S.top;S.base++)
	{
		fp(*S.base);

	}
}

/*------------------------------------------------------------
操作目的:	压栈——插入元素e为新的栈顶元素
初始条件:	栈S已存在
操作结果:	插入数据元素e作为新的栈顶
函数参数:
		SqStack *S	栈S
		ElemType e	待插入的数据元素
返回值:
		bool		操作是否成功
------------------------------------------------------------*/
bool Push(SqStack *S, ElemType e)
{
	if ((S->top - S->base)==S->stacksize)
	{
		//1.分配大一点的空间
		ElemType *newbase = (ElemType*)malloc(sizeof(ElemType)*(S->stacksize+STACKINCREMENT));
		if (!newbase)
		{
			return false;
		}
		//2.复制元素到新的空间
		memcpy(newbase,S->base,sizeof(ElemType)*S->stacksize);
		//3.销毁原储存空间
		free(S->base);

		//4.栈顶指针、栈顶指针
		S->base = newbase;
		S->top = S->base+S->stacksize;
		S->stacksize = S->stacksize+STACKINCREMENT;

	}
	*(S->top) = e;
	S->top++;
	return true;
}

/*------------------------------------------------------------
操作目的:	弹栈——删除栈顶元素
初始条件:	栈S已存在且非空
操作结果:	删除S的栈顶元素,并用e返回其值
函数参数:
		SqStack *S	栈S
		ElemType *e	被删除的数据元素值
返回值:
		bool		操作是否成功
------------------------------------------------------------*/
bool Pop(SqStack *S, ElemType *e)
{
	*e = *(--S->top);
	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
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
预览
Loading comments...
13 条评论
  • W

    数据结构很菜的说

  • W

    我一看到C++ 我就知道,这个我不懂了,哈哈啊·····

    • W

      回复 @淡忘~浅思: 没事,可以互喂的O(∩_∩)O~

    • W

      回复 @蜜汁炒酸奶: 太残暴了 废了就不能吃饭了 :mrgreen:

    • W

      回复 @淡忘~浅思: 恩恩,让我们脉脉含情的望着对方,双爪十指相扣,废掉也不分开→_→

    • W

      回复 @淡忘~浅思: 恩恩,握到废

    • W

      回复 @Me.稀奇: 其实。。。现在我也不懂了,但我会告诉你么→_→,哈哈啊·····

  • W

    我觉得我要跟你一起学,不知道会不会变成痴呆,比较脑细胞不多

    • W

      回复 @小左: C这块一定是会的,毕竟这些都是当初的作业,好久没看过了,留在这只是做个纪念,当初也没深究过- -

  • W

    :cool: 例行转转。博主下午好!文章非常不错,可以看出来博主是实力派。

example
预览