
1.栈的顺序存储结构
//*********************************stack_array.h************************************
#ifndef STACK_ARRAY_H
#define STACK_ARRAY_H
#define MAXSIZE 1000
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int datatype;
typedef struct stack_array
{
datatype data[MAXSIZE];
size_t top;
}SqStack;
//栈初始化
bool InitStack(SqStack *p);
//入栈
bool push(SqStack *stack,datatype e);
//出栈
bool pop(SqStack *stack,datatype *e);
#endif //STACK_ARRAY_H
//*********************************stack_array.c************************************
#include "stack_array.h"
//栈初始化
bool InitStack(SqStack *p)
{
if(NULL == p)return false;
p->top = -1;
return true;
}
//入栈
bool push(SqStack *stack,datatype e)
{
if(MAXSIZE-1 == stack->top)return false;//栈满
++stack->top;//入栈
stack->data[stack->top] = e;
return true;
}
//出栈
bool pop(SqStack *stack,datatype *e)
{
if(-1 == stack->top)return false;
*e = stack->data[stack->top];
--stack->top;
return true;
}
//*********************************stack_arrayTest.c************************************
#include "stack_array.h"
int main()
{
SqStack stack;
InitStack(&stack);
for(int i = 1;i <= 10;i++)
{
push(&stack,i);
}
datatype tmp;
for(int i =1;i <= 10;i++)
{
pop(&stack,&tmp);
printf("%d
",tmp);
}
}104
1
//*********************************stack_array.h************************************2
3
4
5
6
7
8
9
typedef int datatype;10
11
typedef struct stack_array12
{13
datatype data[MAXSIZE];14
size_t top;15
}SqStack;16
17
18
//栈初始化19
bool InitStack(SqStack *p);20
21
22
//入栈23
bool push(SqStack *stack,datatype e);24
25
26
//出栈27
bool pop(SqStack *stack,datatype *e);28
29
30
//STACK_ARRAY_H31
32
33
//*********************************stack_array.c************************************34
35
36
37
//栈初始化38
bool InitStack(SqStack *p)39
{40
if(NULL == p)return false;41
p->top = -1;42
return true;43
}44
45
//入栈46
bool push(SqStack *stack,datatype e)47
{48
if(MAXSIZE-1 == stack->top)return false;//栈满49
50
++stack->top;//入栈51
stack->data[stack->top] = e;52
53
return true;54
}55
56
57
//出栈58
bool pop(SqStack *stack,datatype *e)59
{60
if(-1 == stack->top)return false;61
*e = stack->data[stack->top];62
--stack->top;63
return true;64
}65
66
67
68
//*********************************stack_arrayTest.c************************************69
70
71
72
73
74
75
76
int main()77
78
{79
80
SqStack stack;81
82
InitStack(&stack);83
84
for(int i = 1;i <= 10;i++)85
86
{87
88
push(&stack,i);89
90
}91
92
datatype tmp;93
94
for(int i =1;i <= 10;i++)95
96
{97
98
pop(&stack,&tmp);99
100
printf("%d
",tmp);101
102
}103
104
}2.两栈共享空间(栈的顺序存储结构)
//*******************************stack_share.h***********************************
#ifndef STACK_SHARE_H
#define STACK_SHARE_H
#define MAXSIZE 1000
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <memory.h>
typedef int datatype;
typedef struct stack_share
{
datatype data[MAXSIZE];
size_t top1;
size_t top2;
}SqDoubleStack;
//初始化栈
void InitStack(SqDoubleStack *stack);
//压栈
bool push(SqDoubleStack *stack,datatype e,int num);
//弹栈
bool pop(SqDoubleStack *stack,datatype *e,int num);
#endif //STACK_SHARE_H
//*******************************stack_share.c***********************************
#include "stack_share.h"
//初始化栈
void InitStack(SqDoubleStack *stack)
{
stack->top1 = -1;
stack->top2 = MAXSIZE;
}
//压栈
bool push(SqDoubleStack *stack,datatype e,int num)
{
if(stack->top1+1 == stack->top2)return false;
if(1 == num)
{
stack->data[++stack->top1] = e;
}
else if(2 == num)
{
stack->data[--stack->top2] = e;
}
return true;
}
//弹栈
bool pop(SqDoubleStack *stack,datatype *e,int num)
{
if(1 == num)
{
if(-1 != stack->top1)return false;
*e = stack->data[stack->top1--];
}
else if(2 == num)
{
if(MAXSIZE != stack->top2)return false;
*e = stack->data[stack->top2++];
}
return true;
}
//*******************************stack_shareTest.c***********************************
#include "stack_share.h"
int main()
{
SqDoubleStack stack;
InitStack(&stack);
memset(stack.data,0,sizeof(int)*1000);
for(int i =1;i <= 10;i++)
{
push(&stack,i,1);
}
for(int i =1;i <= 10;i++)
{
push(&stack,i,2);
}
for(int i = 0;i < 1000;i++)
{
printf("%d ",stack.data[i]);
}
return 0;
}126
1
//*******************************stack_share.h***********************************2
3
4
5
6
7
8
9
10
11
typedef int datatype;12
13
typedef struct stack_share14
{15
datatype data[MAXSIZE];16
size_t top1;17
size_t top2;18
}SqDoubleStack;19
20
21
//初始化栈22
void InitStack(SqDoubleStack *stack);23
24
//压栈25
bool push(SqDoubleStack *stack,datatype e,int num);26
27
//弹栈28
bool pop(SqDoubleStack *stack,datatype *e,int num);29
30
31
32
//STACK_SHARE_H33
34
35
//*******************************stack_share.c***********************************36
37
38
39
//初始化栈40
void InitStack(SqDoubleStack *stack)41
{42
stack->top1 = -1;43
stack->top2 = MAXSIZE;44
}45
46
//压栈47
bool push(SqDoubleStack *stack,datatype e,int num)48
{49
if(stack->top1+1 == stack->top2)return false;50
51
if(1 == num)52
{53
stack->data[++stack->top1] = e;54
}55
else if(2 == num)56
{57
stack->data[--stack->top2] = e;58
}59
return true;60
}61
62
//弹栈63
bool pop(SqDoubleStack *stack,datatype *e,int num)64
{65
if(1 == num)66
{67
if(-1 != stack->top1)return false;68
*e = stack->data[stack->top1--];69
}70
else if(2 == num)71
{72
if(MAXSIZE != stack->top2)return false;73
*e = stack->data[stack->top2++];74
}75
return true;76
}77
78
79
80
//*******************************stack_shareTest.c***********************************81
82
83
84
85
86
87
88
int main()89
90
{91
92
SqDoubleStack stack;93
94
InitStack(&stack);95
96
memset(stack.data,0,sizeof(int)*1000);97
98
for(int i =1;i <= 10;i++)99
100
{101
102
push(&stack,i,1);103
104
}105
106
for(int i =1;i <= 10;i++)107
108
{109
110
push(&stack,i,2);111
112
}113
114
115
116
for(int i = 0;i < 1000;i++)117
118
{119
120
printf("%d ",stack.data[i]);121
122
}123
124
return 0;125
126
}3.*****链栈*****
//****************************stack_link.h************************************
#ifndef STACK_LINK_H
#define STACK_LINK_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int datatype;
typedef struct StackNode
{
datatype data;
struct StackNode *next;
}StackNode;
typedef struct StackLink
{
StackNode *top;
size_t count;
}Stack;
//创建链栈
Stack *create();
//压栈
bool push(Stack *stack,datatype e);
//弹栈
bool pop(Stack *stack,datatype *e);
#endif //STACK_LINK_H
//****************************stack_link.c************************************
#include "stack_link.h"
//创建链栈
Stack *create()
{
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->top = NULL;
stack->count = 0;
return stack;
}
//压栈
bool push(Stack *stack,datatype e)
{
if(NULL == stack)return false;
StackNode *node = (StackNode *)malloc(sizeof(StackNode)); //申请新节点
node->data = e;//为新节点赋值
node->next = stack->top;
stack->top = node;//使top指向新节点
++stack->count;//count++
return true;
}
//弹栈
bool pop(Stack *stack,datatype *e)
{
if(NULL == stack->top)return false;//如果栈空,弹出失败
StackNode *curr = stack->top;//保存栈顶节点地址
StackNode *next = curr->next;//保存栈顶下一个节点地址
*e = curr->data;//保存弹出值
stack->top = next;//使top指向原栈顶下一个节点
--stack->count;
free(curr);
return true;
}
//****************************stack_linkTest.c************************************
#include "stack_link.h"
int main()
{
Stack *stack = create();
for(int i = 1;i <= 10;i++)
{
push(stack,i);
}
datatype tmp;
for(int i = 1;i <= 10;i++)
{
pop(stack,&tmp);
printf("%d ",tmp);
}
printf("
");
return 0;
}x
1
//****************************stack_link.h************************************2
3
4
5
6
7
8
9
10
11
typedef int datatype;12
13
14
typedef struct StackNode15
16
{17
18
datatype data;19
20
struct StackNode *next;21
22
}StackNode;23
24
typedef struct StackLink25
26
{27
28
StackNode *top;29
30
size_t count;31
32
}Stack;33
34
35
36
//创建链栈37
Stack *create();38
39
//压栈40
41
bool push(Stack *stack,datatype e);42
43
//弹栈44
45
bool pop(Stack *stack,datatype *e);46
47
48
//STACK_LINK_H49
50
51
52
//****************************stack_link.c************************************53
54
55
56
//创建链栈57
58
Stack *create()59
60
{61
62
Stack *stack = (Stack *)malloc(sizeof(Stack));63
64
stack->top = NULL;65
66
stack->count = 0;67
68
return stack;69
70
}71
72
73
74
//压栈75
76
bool push(Stack *stack,datatype e)77
78
{79
80
if(NULL == stack)return false;81
82
83
84
StackNode *node = (StackNode *)malloc(sizeof(StackNode)); //申请新节点85
86
87
88
node->data = e;//为新节点赋值89
90
node->next = stack->top;91
92
93
94
stack->top = node;//使top指向新节点95
96
++stack->count;//count++97
98
return true;99
100
}101
102
103
104
105
106
//弹栈107
108
bool pop(Stack *stack,datatype *e)109
110
{111
112
if(NULL == stack->top)return false;//如果栈空,弹出失败113
114
115
116
StackNode *curr = stack->top;//保存栈顶节点地址117
118
StackNode *next = curr->next;//保存栈顶下一个节点地址119
120
121
122
*e = curr->data;//保存弹出值123
124
stack->top = next;//使top指向原栈顶下一个节点125
126
--stack->count;127
128
129
130
free(curr);131
132
return true;133
134
}135
136
137
138
//****************************stack_linkTest.c************************************139
140
141
142
143
int main()144
145
{146
147
Stack *stack = create();148
149
for(int i = 1;i <= 10;i++)150
151
{152
153
push(stack,i);154
155
}156
157
datatype tmp;158
159
for(int i = 1;i <= 10;i++)160
161
{162
163
pop(stack,&tmp);164
165
printf("%d ",tmp);166
167
}168
169
printf("
");170
171
return 0;172
173
}4.循环队列(顺序存储结构)
//************************************circular_queue.h****************************************
#ifndef CIRCULAR_LINK_H
#define CIRCULAR_LINK_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define MAXSIZE 1000
typedef int datatype;
typedef struct
{
datatype data[MAXSIZE];
size_t front;
size_t rear;
}SqQueue;
//初始化队列
void InitQueue(SqQueue *Q);
//求队列长度
size_t length(SqQueue Q);
//入队
bool EnQueue(SqQueue *Q,datatype e);
//出队
bool DeQueue(SqQueue *Q,datatype *e);
#endif //CIRCULAR_LINK_H
//************************************circular_queue.c****************************************
#include "circular_queue.h"
//初始化队列
void InitQueue(SqQueue *Q)
{
Q->front = 0;
Q->rear = 0;
}
//求队列长度
size_t length(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//入队
bool EnQueue(SqQueue *Q,datatype e)
{
if((Q->rear+1)%MAXSIZE == Q->front)return false;
Q->data[Q->rear] = e;
Q->rear = (Q->rear+1)%MAXSIZE;
return false;
}
//出队
bool DeQueue(SqQueue *Q,datatype *e)
{
if(Q->front == Q->rear)return false;
*e = Q->data[Q->front];
Q->front = (Q->front+1)%MAXSIZE;
return true;
}
//************************************circular_queueTest.c****************************************
#include "circular_queue.h"
int main()
{
SqQueue Q;
InitQueue(&Q);
printf("length:%d
",length(Q));
for(size_t i = 1;i <= 1000;i++)
{
EnQueue(&Q,i);
}
printf("length:%d
",length(Q));
size_t temp;
for(size_t i = 1;i <= 10;i++)
{
DeQueue(&Q,&temp);
printf("%d ",temp);
}
printf("
");
printf("length:%d
",length(Q));
for(size_t i = 1;i <= 10;i++)
{
EnQueue(&Q,i);
}
printf("length:%d
",length(Q));
for(size_t i = 1;i <= 1000;i++)
{
DeQueue(&Q,&temp);
printf("%d ",temp);
}
printf("length:%d
",length(Q));
return 0;
}x
112
1
//************************************circular_queue.h****************************************2
3
4
5
6
7
8
9
typedef int datatype;10
11
typedef struct 12
{13
datatype data[MAXSIZE];14
size_t front;15
size_t rear;16
}SqQueue;17
18
19
//初始化队列20
void InitQueue(SqQueue *Q);21
22
//求队列长度23
size_t length(SqQueue Q);24
25
//入队26
bool EnQueue(SqQueue *Q,datatype e);27
28
//出队29
bool DeQueue(SqQueue *Q,datatype *e);30
31
32
//CIRCULAR_LINK_H33
34
35
//************************************circular_queue.c****************************************36
37
38
39
//初始化队列40
void InitQueue(SqQueue *Q)41
{ 42
Q->front = 0;43
Q->rear = 0;44
}45
46
//求队列长度47
size_t length(SqQueue Q)48
{49
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;50
}51
52
//入队53
bool EnQueue(SqQueue *Q,datatype e)54
{55
if((Q->rear+1)%MAXSIZE == Q->front)return false;56
57
Q->data[Q->rear] = e;58
Q->rear = (Q->rear+1)%MAXSIZE;59
return false;60
}61
62
//出队63
bool DeQueue(SqQueue *Q,datatype *e)64
{65
if(Q->front == Q->rear)return false;66
67
*e = Q->data[Q->front];68
Q->front = (Q->front+1)%MAXSIZE;69
return true;70
}71
72
73
74
//************************************circular_queueTest.c****************************************75
76
77
78
int main()79
{80
SqQueue Q;81
InitQueue(&Q);82
83
printf("length:%d
",length(Q));84
85
for(size_t i = 1;i <= 1000;i++)86
{87
EnQueue(&Q,i);88
}89
printf("length:%d
",length(Q));90
size_t temp;91
92
for(size_t i = 1;i <= 10;i++)93
{94
DeQueue(&Q,&temp);95
printf("%d ",temp);96
}97
printf("
");98
printf("length:%d
",length(Q));99
for(size_t i = 1;i <= 10;i++)100
{101
EnQueue(&Q,i);102
}103
104
printf("length:%d
",length(Q));105
for(size_t i = 1;i <= 1000;i++)106
{107
DeQueue(&Q,&temp);108
printf("%d ",temp);109
}110
printf("length:%d
",length(Q));111
return 0;112
}5.链队列
//*******************************queue_link.h****************************************
#ifndef QUEUE_LINK_H
#define QUEUE_LINK_H
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef int datatype;
typedef struct QNode
{
datatype data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front,rear;
}LinkQueue;
//创建队列
LinkQueue create();
//入队
bool EnQueue(LinkQueue *Q,datatype e);
//出队
bool DeQueue(LinkQueue *Q,datatype *e);
#endif //QUEUE_LINK_H
//*******************************queue_link.c****************************************
#include "queue_link.h"
//创建队列
LinkQueue create()
{
QueuePtr head = (QueuePtr)malloc(sizeof(QNode));
head->next = NULL;
LinkQueue Q;
Q.front = head;
Q.rear = head;
return Q;
}
//入队
bool EnQueue(LinkQueue *Q,datatype e)
{
QueuePtr s = (QueuePtr)malloc(sizeof(QNode));//创建新节点
if(!s)return false;
s->data = e; //设置新节点数据
s->next = NULL;
Q->rear->next = s; //将原来的队尾指向新节点
Q->rear = s; //队尾指针指向s
return true;
}
//出队
bool DeQueue(LinkQueue *Q,datatype *e)
{
if(Q->front == Q->rear)return false;
QueuePtr node = Q->front->next;//保存要删除节点的地址
QueuePtr behind = node->next;//保存要删除节点下一个节点的地址
*e = node->data;//保存数据
Q->front->next = behind;//使front指向下一个节点
if(Q->rear == node)Q->rear = Q->front;//假如出队前队列只有一个元素,则出队后队列为空,队尾应该指向头节点。
free(node);
return true;
}
//*******************************queue_linkTest.c****************************************
#include "queue_link.h"
int main()
{
LinkQueue Q = create();
for(size_t i = 1;i <= 10;i++)
{
EnQueue(&Q,i);
}
size_t tmp;
for(size_t i = 1;i <= 10;i++)
{
DeQueue(&Q,&tmp);
printf("%d ",tmp);
}
printf("
");
return 0;
}x
150
1
//*******************************queue_link.h****************************************2
3
4
5
6
7
8
9
10
11
12
typedef int datatype;13
14
15
16
typedef struct QNode17
18
{19
20
datatype data;21
22
struct QNode *next;23
24
}QNode,*QueuePtr;25
26
27
typedef struct 28
29
{30
31
QueuePtr front,rear;32
33
}LinkQueue;34
35
//创建队列36
37
LinkQueue create();38
39
//入队40
41
bool EnQueue(LinkQueue *Q,datatype e);42
43
//出队44
45
bool DeQueue(LinkQueue *Q,datatype *e);46
47
48
//QUEUE_LINK_H49
50
51
//*******************************queue_link.c****************************************52
53
54
55
//创建队列56
57
LinkQueue create()58
59
{60
61
QueuePtr head = (QueuePtr)malloc(sizeof(QNode));62
63
head->next = NULL;64
65
LinkQueue Q;66
67
Q.front = head;68
69
Q.rear = head;70
71
return Q;72
73
}74
75
76
77
//入队78
79
bool EnQueue(LinkQueue *Q,datatype e)80
81
{82
83
QueuePtr s = (QueuePtr)malloc(sizeof(QNode));//创建新节点84
85
if(!s)return false;86
87
88
89
s->data = e; //设置新节点数据90
91
s->next = NULL;92
93
94
95
Q->rear->next = s; //将原来的队尾指向新节点96
97
Q->rear = s; //队尾指针指向s98
99
return true;100
101
}102
103
104
105
//出队106
107
bool DeQueue(LinkQueue *Q,datatype *e)108
109
{110
111
if(Q->front == Q->rear)return false;112
113
114
115
QueuePtr node = Q->front->next;//保存要删除节点的地址116
117
QueuePtr behind = node->next;//保存要删除节点下一个节点的地址118
119
120
121
*e = node->data;//保存数据122
123
124
125
Q->front->next = behind;//使front指向下一个节点126
127
128
129
if(Q->rear == node)Q->rear = Q->front;//假如出队前队列只有一个元素,则出队后队列为空,队尾应该指向头节点。130
131
132
133
free(node);134
135
136
137
return true;138
139
}140
141
142
143
144
145
//*******************************queue_linkTest.c****************************************146
147
148
149
150
int main()151
152
{153
154
LinkQueue Q = create();155
156
157
158
for(size_t i = 1;i <= 10;i++)159
160
{161
162
EnQueue(&Q,i);163
164
}165
166
167
168
size_t tmp;169
170
for(size_t i = 1;i <= 10;i++)171
172
{173
174
DeQueue(&Q,&tmp);175
176
printf("%d ",tmp);177
178
}179
180
printf("
");181
182
return 0;183
184
}