栈
应用:深搜
总结:普通的顺序表本来有一头就是固定的,而对于栈这种只有一端存在数据变化的情况,使用顺序表实现会比较自然,而使用链表实现的话,更是相当于降维打击,直接将头节点与栈顶绑定在一起,虚拟头节点都可以不需要。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define COLOR(a, b) "\033[" #b "m" a "\033[0m"
#define RED(a) COLOR(a, 31)
#define GREEN(a) COLOR(a, 32)
//结构定义:栈(顺序表)
typedef struct Stack {
int *data;
int size, length;
} Stack;
//结构操作
Stack *init(int size);
void clear(Stack *stack);
int expand(Stack *stack);
int push(Stack *stack, int val);
int top(Stack *stack);
int empty(Stack *stack);
int pop(Stack *stack);
void output(Stack *stack);
int main() {
srand(time(0));
#define MAX_N 20
Stack *stack = init(1);
for (int i = 0; i < MAX_N; i++) {
int op = rand() % 4;
int val = rand() % 100;
switch (op) {
case 0:
case 1:
case 2: {
printf("push %d to the Stack = %d\n", val, push(stack, val));
} break;
case 3: {
if (empty(stack)) {
printf("pop from the Stack = 0\n");
} else {
printf("pop %d from the Stack = ", top(stack));
printf("%d\n", pop(stack));
}
} break;
}
output(stack), printf("\n");
}
#undef MAX_N
clear(stack);
return 0;
}
//结构操作:初始化栈
Stack *init(int size) {
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->data = (int *)malloc(sizeof(int) * size);
stack->size = size;
stack->length = 0;
return stack;
}
//结构操作:销毁栈
void clear(Stack *stack) {
if (stack == NULL) return;
free(stack->data);
free(stack);
return;
}
//结构操作:栈扩容
int expand(Stack *stack) {
int extra_size = stack->size;
int *temp;
while (extra_size) {
temp = (int *)realloc(stack->data, sizeof(int) * (stack->size + extra_size));
if (temp != NULL) break;
extra_size >>= 1;
}
if (temp == NULL) return 0;
stack->data = temp;
stack->size += extra_size;
return 1;
}
//结构操作:入栈
int push(Stack *stack, int val) {
if (stack == NULL) return 0;
if (stack->length == stack->size) {
if (!expand(stack)) {
printf(RED("fail to expand!\n"));
return 0;
}
printf(GREEN("success to expand! the new size = %d\n"), stack->size);
}
stack->data[stack->length++] = val;
return 1;
}
//结构操作:访问栈顶元素
int top(Stack *stack) {
return stack->data[stack->length - 1];
}
//结构操作:栈判空
int empty(Stack *stack) {
return stack->length == 0;
}
//结构操作:出栈
int pop(Stack *stack) {
if (stack == NULL) return 0;
if (empty(stack)) return 0;
stack->length -= 1;
return 1;
}
//结构操作:输出所有元素
void output(Stack *stack) {
printf("Stack(%d): [", stack->length);
for (int i = 0; i < stack->length; i++) {
i && printf(", ");
printf("%d", stack->data[i]);
}
printf("]\n");
return;
}
链栈
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define COLOR(a, b) "\033[" #b "m" a "\033[0m"
#define RED(a) COLOR(a, 31)
#define GREEN(a) COLOR(a, 32)
//结构定义:链表节点
typedef struct Node {
int data;
Node *next;
} Node;
//结构定义:栈(链表)
typedef struct Stack {
Node *head;
int length;
} Stack;
//结构操作
Node *getNewNode(int val);
Stack *init();
void clear_node(Node *node);
void clear(Stack *stack);
int push(Stack *stack, int val);
int top(Stack *stack);
int empty(Stack *stack);
int pop(Stack *stack);
void output(Stack *stack);
int main() {
srand(time(0));
#define MAX_N 20
Stack *stack = init();
for (int i = 0; i < MAX_N; i++) {
int op = rand() % 4;
int val = rand() % 100;
switch (op) {
case 0:
case 1:
case 2: {
printf("push %d to the Stack = %d\n", val, push(stack, val));
} break;
case 3: {
if (empty(stack)) {
printf("pop from the Stack = 0\n");
} else {
printf("pop %d from the Stack = ", top(stack));
printf("%d\n", pop(stack));
}
} break;
}
output(stack), printf("\n");
}
#undef MAX_N
clear(stack);
return 0;
}
//结构操作:获得一个新节点
Node *getNewNode(int val) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = val;
node->next = NULL;
return node;
}
//结构操作:初始化栈
Stack *init() {
Stack *stack = (Stack *)malloc(sizeof(Stack));
stack->head = NULL;
stack->length = 0;
return stack;
}
//结构操作:释放一个节点
void clear_node(Node *node) {
if (node == NULL) return;
free(node);
return;
}
//结构操作:销毁栈
void clear(Stack *stack) {
if (stack == NULL) return;
Node *node = stack->head, *post_node;
while (node != NULL) {
post_node = node->next;
free(node);
node = post_node;
}
free(stack);
return;
}
//结构操作:入栈
int push(Stack *stack, int val) {
if (stack == NULL) return 0;
Node *node = getNewNode(val);
node->next = stack->head;
stack->head = node;
stack->length += 1;
return 1;
}
//结构操作:访问栈顶元素
int top(Stack *stack) {
return stack->head->data;
}
//结构操作:栈判空
int empty(Stack *stack) {
return stack->length == 0;
}
//结构操作:出栈
int pop(Stack *stack) {
if (stack == NULL) return 0;
if (empty(stack)) return 0;
Node *node = stack->head;
stack->head = node->next;
free(node);
stack->length -= 1;
return 1;
}
//结构操作:输出所有元素
void output(Stack *stack) {
printf("Stack(%d): [", stack->length);
for (Node *node = stack->head; node != NULL; node = node->next) {
node != stack->head && printf(", ");
printf("%d", node->data);
}
printf("]\n");
return;
}