应用:深搜

总结:普通的顺序表本来有一头就是固定的,而对于栈这种只有一端存在数据变化的情况,使用顺序表实现会比较自然,而使用链表实现的话,更是相当于降维打击,直接将头节点与栈顶绑定在一起,虚拟头节点都可以不需要。

#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;
}

原文地址:http://www.cnblogs.com/Kelvin-Wu/p/16795298.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性