Stack_L.h
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio>
2 #include <cstdlib>
3 //链栈 Freeze 2010 10 4
4 typedef struct Point{
5 int low;
6 int high;
7 }Point;
8 typedef Point StackElemType;
9
10 typedef struct Node
11 {
12 StackElemType data;
13 struct Node *next;
14 }Node;
15 typedef struct {
16 Node *base; //存储空间基指针;
17 Node *top; //栈顶指点针
18 int size; //长度,默认为0
19 }LiStack;
20
21
22 LiStack* initStack(LiStack *S); //构造一个空栈S
23 void freeStack(LiStack *S); //若栈已存在,销毁栈S
24 bool isEmpty(const LiStack *S); //若栈S为空,则返回ture,否则返回false
25 StackElemType get(const LiStack *S); //返回栈顶元素
26 Node* push(LiStack *S,StackElemType e); //入栈
27 StackElemType pop(LiStack *S); //出栈
28
29
30 //构造一个空栈S
31 LiStack* initStack(LiStack *S)
32 {
33 S=(LiStack *)malloc(sizeof(LiStack));
34 if(!S)
35 {
36 printf("内存不足\n");
37 exit(1);
38 }
39 S->top=NULL;
40 S->base=NULL;
41 S->size=0;
42 return S;
43 }
44
45 //销毁栈S
46 void freeStack(LiStack *S)
47 {
48 while(S->size>0)
49 pop(S);
50 free(S);
51 }
52
53 //若栈S为空,则返回ture,否则返回false
54 bool isEmpty(const LiStack *S)
55 {
56 return(S->size==0);
57 }
58
59 //返回栈顶元素 若栈为空,则报错
60 StackElemType get(const LiStack *S)
61 {
62 if (!isEmpty(S))
63 return S->top->data;
64 else{
65 printf("空栈,无法入栈!\n");
66 exit(1);
67 }
68 }
69
70 //插入元素e成为新的栈顶元素
71 Node* push(LiStack *S,StackElemType e)
72 {
73 Node *temp=(Node *)malloc(sizeof(Node));
74 if (!temp)
75 {
76 printf("内存不足\n");
77 exit(1);
78 }
79 temp->data=e;
80 if (S->size==0)//插入的是第一个元素
81 {
82 S->top=temp;
83 S->base=temp;
84 temp->next=NULL;
85 }
86 else
87 {
88 temp->next=S->top;
89 S->top=temp;
90 }
91 S->size++;
92 return temp;
93 }
94
95 //出栈
96 StackElemType pop(LiStack *S)
97 {
98 if (isEmpty(S)){
99 printf("空栈,无法出栈!\n");
100 exit(1);
101 }else{
102 S->size--;
103 Node *temp=S->top;
104 StackElemType data=S->top->data;
105 S->top=temp->next;
106 free(temp);
107 return data;
108 }
109 }
2 #include <cstdlib>
3 //链栈 Freeze 2010 10 4
4 typedef struct Point{
5 int low;
6 int high;
7 }Point;
8 typedef Point StackElemType;
9
10 typedef struct Node
11 {
12 StackElemType data;
13 struct Node *next;
14 }Node;
15 typedef struct {
16 Node *base; //存储空间基指针;
17 Node *top; //栈顶指点针
18 int size; //长度,默认为0
19 }LiStack;
20
21
22 LiStack* initStack(LiStack *S); //构造一个空栈S
23 void freeStack(LiStack *S); //若栈已存在,销毁栈S
24 bool isEmpty(const LiStack *S); //若栈S为空,则返回ture,否则返回false
25 StackElemType get(const LiStack *S); //返回栈顶元素
26 Node* push(LiStack *S,StackElemType e); //入栈
27 StackElemType pop(LiStack *S); //出栈
28
29
30 //构造一个空栈S
31 LiStack* initStack(LiStack *S)
32 {
33 S=(LiStack *)malloc(sizeof(LiStack));
34 if(!S)
35 {
36 printf("内存不足\n");
37 exit(1);
38 }
39 S->top=NULL;
40 S->base=NULL;
41 S->size=0;
42 return S;
43 }
44
45 //销毁栈S
46 void freeStack(LiStack *S)
47 {
48 while(S->size>0)
49 pop(S);
50 free(S);
51 }
52
53 //若栈S为空,则返回ture,否则返回false
54 bool isEmpty(const LiStack *S)
55 {
56 return(S->size==0);
57 }
58
59 //返回栈顶元素 若栈为空,则报错
60 StackElemType get(const LiStack *S)
61 {
62 if (!isEmpty(S))
63 return S->top->data;
64 else{
65 printf("空栈,无法入栈!\n");
66 exit(1);
67 }
68 }
69
70 //插入元素e成为新的栈顶元素
71 Node* push(LiStack *S,StackElemType e)
72 {
73 Node *temp=(Node *)malloc(sizeof(Node));
74 if (!temp)
75 {
76 printf("内存不足\n");
77 exit(1);
78 }
79 temp->data=e;
80 if (S->size==0)//插入的是第一个元素
81 {
82 S->top=temp;
83 S->base=temp;
84 temp->next=NULL;
85 }
86 else
87 {
88 temp->next=S->top;
89 S->top=temp;
90 }
91 S->size++;
92 return temp;
93 }
94
95 //出栈
96 StackElemType pop(LiStack *S)
97 {
98 if (isEmpty(S)){
99 printf("空栈,无法出栈!\n");
100 exit(1);
101 }else{
102 S->size--;
103 Node *temp=S->top;
104 StackElemType data=S->top->data;
105 S->top=temp->next;
106 free(temp);
107 return data;
108 }
109 }