队列 (FIFO)
结构操作:尾部入队、头部出队(排队做核酸!捅一个走一个 哈哈哈!)
FIFO
first in firas out : 先进先出
结构定义:
队列长度 (length)
队头位置 (head)
队尾位置 (tail)
任意类型元素 (data_type) (int \ char)
连续空间存储
循环队列
在队列结构定义之上 count
计数 (count) 可判断满和空
tail % leng

出队操作 - 入队操作
出队 (head += 1)
入队 (tail += 1)
假溢出
出队操作 - 入队操作 - 假溢出优化
入队 (q->count != q->length) 当前队列数据总长度 (count)、队列总长度 (q->length)
满足条件情况:
- q->data[q->tail++] = val;
- if(q->tail == q->leng ) q->tail = 0;
- q->count++;
出队 empty(q) 是否存在元素
满足条件情况:
- q->head++;
- if(q->head == q->leng) q->head = 0;
- q->count–;

队列代码演示 - 无假溢出优化
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
|
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct Queue { int *data; int head, tail; int length; } Queue;
Queue *init(int n) { Queue *q = (Queue *)malloc(sizeof(Queue)); q->data = (int *)malloc(sizeof(int) * n); q->head = 0; q->tail = 0; q->length = n; return q; }
int push(Queue *q, int val) { if(q == NULL) return 0; if(q->tail == q->length) return 0; q->data[q->tail++] = val; return 1; }
int empty(Queue *q) { return q->tail == q->head; }
int pop(Queue *q) { if(q == NULL) return 0; if(empty(q)) return 0; q->head++; return 1; }
int front(Queue *q) { if(q == NULL) return -1; return q->data[q->head]; }
void clear(Queue *q) { if(q == NULL) return ; free(q->data); free(q); return ; }
void output(Queue *q) { if(q == NULL) return ; printf("Queue(%d) [", q->length); for(int i = q->head; i < q->tail; i++) { i != q->head && printf(","); printf("%d", q->data[i]); } printf("]"); printf("\n"); return ; }
int main() { #define MAX_OP 20 srand(time(0)); Queue *q = init(MAX_OP); for(int i = 0; i < MAX_OP; i++) { int op = rand() % 3; int val = rand() % 100; switch(op) { case 0: { if(!empty(q)) { printf("pop front from the Queue = %d \n", pop(q)); } } break; case 1: { printf("push %d to the Queue = %d\n", val, push(q, val)); } break; case 2: { printf("front one from Queue = %d\n", front(q)); } break; } output(q), printf("\n"); } #undef MAX_OP clear(q); return 0; }
|
队列代码演示 - 假溢出优化
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
|
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct Queue { int *data; int head, tail; int length; int count; } Queue;
Queue *init(int n) { Queue *q = (Queue *)malloc(sizeof(Queue)); q->data = (int *)malloc(sizeof(int) * n); q->head = 0; q->tail = 0; q->count = 0; q->length = n; return q; }
int push(Queue *q, int val) { if(q == NULL) return 0; if(q->length == q->count) return 0; q->data[q->tail++] = val; if(q->tail == q->length) q->tail = 0; q->count++; return 1; }
int empty(Queue *q) { return q->count == 0; }
int pop(Queue *q) { if(q == NULL) return 0; if(empty(q)) return 0; q->head++; if(q->head == q->length) q->head = 0; q->count--; return 1; }
int front(Queue *q) { if(q == NULL) return -1; return q->data[q->head]; }
void clear(Queue *q) { if(q == NULL) return ; free(q->data); free(q); return ; }
void output(Queue *q) { if(q == NULL) return ; printf("Queue(%d) [", q->length); for(int i = q->head, j = 0; j < q->count; j++) { j && printf(","); printf("%d", q->data[(i + j) % q->length]); } printf("]"); printf("\n"); return ; }
int main() { #define MAX_OP 20 srand(time(0)); Queue *q = init(4); for(int i = 0; i < MAX_OP; i++) { int op = rand() % 3; int val = rand() % 100; switch(op) { case 0: { if(!empty(q)) { printf("pop front from the Queue = %d \n", pop(q)); } } break; case 1: { printf("push %d to the Queue = %d\n", val, push(q, val)); } break; case 2: { printf("front one from Queue = %d\n", front(q)); } break; } output(q), printf("\n"); } #undef MAX_OP clear(q); return 0; }
|
队列代码演示 - 假溢出优化 - 自动扩容
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
|
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct Queue { int *data; int head, tail; int length; int count; } Queue;
Queue *init(int n) { Queue *q = (Queue *)malloc(sizeof(Queue)); q->data = (int *)malloc(sizeof(int) * n); q->head = 0; q->tail = 0; q->count = 0; q->length = n; return q; }
int expand(Queue *q) { int extr_size = q->length; int *p; while(extr_size) { p = (int *)malloc(sizeof(int) * (extr_size + q->length)); if(p != NULL) break; extr_size >>= 1; } if(p == NULL) return 0; for(int i = q->head, j = 0; j < q->count; j++) { p[j] = q->data[(i + j) % q->length]; } q->data = p; q->head = 0, q->tail = q->count; q->length += extr_size; return 1; }
int push(Queue *q, int val) { if(q == NULL) return 0; if(q->length == q->count) { if(!expand(q)) { printf("自动扩容失败!\n"); return 0; } printf("自动扩容成功!\n"); } q->data[q->tail++] = val; if(q->tail == q->length) q->tail = 0; q->count++; return 1; }
int empty(Queue *q) { return q->count == 0; }
int pop(Queue *q) { if(q == NULL) return 0; if(empty(q)) return 0; q->head++; if(q->head == q->length) q->head = 0; q->count--; return 1; }
int front(Queue *q) { if(q == NULL) return -1; return q->data[q->head]; }
void clear(Queue *q) { if(q == NULL) return ; free(q->data); free(q); return ; }
void output(Queue *q) { if(q == NULL) return ; printf("Queue(%d) [", q->length); for(int i = q->head, j = 0; j < q->count; j++) { j && printf(","); printf("%d", q->data[(i + j) % q->length]); } printf("]"); printf("\n"); return ; }
int main() { #define MAX_OP 20 srand(time(0)); Queue *q = init(1); for(int i = 0; i < MAX_OP; i++) { int op = rand() % 3; int val = rand() % 100; switch(op) { case 0: { if(!empty(q)) { printf("pop front from the Queue = %d \n", pop(q)); } } break; case 1: { printf("push %d to the Queue = %d\n", val, push(q, val)); } break; case 2: { printf("front one from Queue = %d\n", front(q)); } break; } output(q), printf("\n"); } #undef MAX_OP clear(q); return 0; }
|
栈 (FILO) - (手枪弹夹🔫)
FILO
first in last out : 先进后出
结构定义:
栈大小 (size)
栈顶指针 (top)
栈中元素 (data_type)
连续空间存储

栈代码演示 - 自动扩容
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
|
#include <stdio.h> #include <stdlib.h> #include <time.h>
typedef struct Stack { int *data; int size; int top; } Stack;
Stack *init(int n) { Stack *s = (Stack *) malloc(sizeof(Stack)); s->data = (int *)malloc(sizeof(int) * n); s->size = n; s->top = -1; return s; }
void clear(Stack *s) { if(s == NULL) return ; free(s->data); free(s); return ; } int expand(Stack *s) { int extr_size = s->size; int *p; while(extr_size) { p = (int *) realloc(s->data,sizeof(int) * ( extr_size * s->size)); if(p != NULL) break; extr_size >>= 1; } if(p == NULL) return 0; s->data = p; s->size += extr_size; return 1; }
int push(Stack *s, int val) { if(s == NULL) return 0; if(s->top == s->size - 1) { if(!expand(s)) { printf("自动扩容失败!\n"); return 0; } printf("自带扩容成功!\n"); } s->data[++(s->top)] = val; return 1; }
int empty(Stack *s) { if(s == NULL) return 1; return s->top == -1; }
int pop(Stack *s) { if(s == NULL) return 0; if(empty(s)) return 0; s->top--; return 1; }
int top(Stack *s) { if(s == NULL) return 0; if(empty(s)) return 0; return s->data[s->top]; }
void output(Stack *s) { if(s == NULL) return ; printf("Stack(%d, %d) : [", s->size, s->top); for(int i = s->top; ~i; i--) { i != s->top && printf(", "); printf("%d", s->data[i]); } printf("]\n"); return ; }
int main() { srand(time(0)); #define MAX_OP 20 Stack *s = init(1); for(int i = 0; i < MAX_OP; i++) { int val = rand() % 100; int op = rand() % 3; switch(op) { case 0: { if(s != NULL) printf("top %d from the Stack \n", top(s)); } break; case 1: { printf("push %d to the Stack = %d\n", val, push(s, val)); } break; case 2: { if(s != NULL) printf("pop %d from the Stack \n", pop(s)); } break; } output(s), printf("\n"); }
#undef MAX_OP clear(s); return 0; }
|
链栈
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
|
#include <stdio.h> #include <stdlib.h> #include <time.h>
typedef struct StackNode { int data; StackNode *next; } StackNode;
typedef struct LinkStack { StackNode *top; int length; } LinkStack;
StackNode *init_node(int val) { StackNode *p = (StackNode * )malloc(sizeof(StackNode)); p->data = val; p->next = NULL; return p; }
LinkStack *init_stack() { LinkStack *l = (LinkStack *)malloc(sizeof(LinkStack)); l->top = NULL; l->length = 0; return l; }
int empty(LinkStack *l) { return l->top == NULL; }
int Stack_top(LinkStack *l) { if(empty(l)) return -1; return l->top->data; }
int push(LinkStack *l, int val) { if(l == NULL) return 0; StackNode *node = init_node(val); node->next = l->top; l->top = node; l->length += 1; return 1; }
void clear_node(StackNode *node) { if(node == NULL) return ; free(node); return ; }
void clear(LinkStack *l) { if(l == NULL) return ; StackNode *p = l->top, *t; while(p) { t = p->next; clear_node(p); p = t; } free(l); return ; }
int pop(LinkStack *l) { if(l == NULL) return 0; if(empty(l)) return 0; StackNode *p = l->top; l->top = l->top->next; clear_node(p); l->length -= 1; return 1; }
void output_node(StackNode *p) { if(p == NULL) return ; while(p) { printf("%d ", p->data); p = p->next; } return ; }
void output(LinkStack *l) { if(l == NULL) return ; printf("LinkStack(%d) : ", l->length); output_node(l->top); printf("\n"); return ; }
int main() { srand(time(0)); #define MAX_OP 20 LinkStack *s = init_stack(); for(int i = 0; i < MAX_OP; i++) { int op = rand() % 2; int val = rand() % 100; switch(op) { case 0 : { printf("pop %d from the LinkStack = ", Stack_top(s)); printf("%d\n", pop(s)); } break; case 1 : { printf("push %d to the form LinkStack = %d\n", val, push(s, val)); } break; } output(s), printf("\n"); }
return 0; }
|
// 待做 链栈、链队列、循环队列扩容、还没实现