-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStack.c
92 lines (77 loc) · 1.76 KB
/
Stack.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
//Stack.c
//[2014/12/11]
//xiaopo
#ifndef STACK_C_
#define STACK_C_
#include "common.h"
//实现
Status InitStack(SeqStack *S)
{
//构造一个空栈S
(*S).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!(*S).base) exit(OVERFLOW);
(*S).top = (*S).base;
(*S).stacksize = STACK_INIT_SIZE;
return OK;
}
Status Push(SeqStack *S, SElemType e)
{
//插入元素e为新的栈顶元素
//判断栈是否已经满了,如果满了就要追加空间
if((*S).top == (*S).base + (*S).stacksize){
(*S).base = (SElemType*)realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!(*S).base) exit(OVERFLOW);
(*S).stacksize += STACKINCREMENT;
}
*((*S).top++) = e;
return OK;
}
SElemType Pop(SeqStack *S)
{
//判断栈是否为空
if((*S).top == (*S).base) return ERROR;
return *(--(*S).top);
}
Status StackEmpty(SeqStack S)
{
if(S.top == S.base) return TRUE;
else return FALSE;
}
Status InitLinkStack(LinkStack *S)
{
int value;
LinkStack head, p;
//建立头节点
*S = (LinkStack)malloc(sizeof(SNode));
if(!(*S)) exit(OVERFLOW);
(*S)->next = NULL;
p = head = *S; //S其实指向得就是头结点!!!
return OK;
}
Status LinkStackPush(LinkStack *S, SElemType e)
{
//插入元素e为新的栈顶元素
LinkStack p = (LinkStack)malloc(sizeof(SNode));
if(!p) exit(OVERFLOW);
p->data = e;
p->next = (*S)->next;
(*S)->next = p;
return OK;
}
SElemType LinkStackPop(LinkStack *S)
{
LinkStack p;
//判断栈是否为空
if((*S)->next == NULL) return ERROR;
p = (*S)->next;
SElemType se = p->data;
(*S)->next = p->next;
free(p);
return se;
}
Status LinkStackEmpty(LinkStack *S)
{
if((*S)->next == NULL) return TRUE;
else return FALSE;
}
#endif // STACK_C_