数据结构链栈实现(c语言)

代码解释

typedef struct StackNode {
    int data;
    struct StackNode *next;
} StackNode, *LinkStack;
  • 定义了一个结构体 StackNode,表示栈的节点,包含整型数据 data 和指向下一个节点的指针 next
  • 使用 typedef 定义了 StackNode 别名为 LinkStack,方便后续使用。
int InitStack(LinkStack *s) {
    *s = NULL;
    return 1;
}
  • 初始化栈,将栈顶指针置为空,即将栈初始化为空栈。
  • 函数返回值为 1 表示初始化成功。
int Push(LinkStack *s, int e) {
    StackNode *p = (StackNode *)malloc(sizeof(StackNode));
    if (!p) {
        return 0;
    }
    p->data = e;
    p->next = *s;
    *s = p;
    return 1;
}

  • 创建一个新节点并将数据 e 入栈。
  • 如果内存分配失败,则返回 0;否则返回 1 表示入栈成功
int Pop(LinkStack *s, int *e) {
    if (*s == NULL) {
        return 0;
    }
    *e = (*s)->data;
    StackNode *p = *s;
    *s = (*s)->next;
    free(p);
    return 1;
}
  • 将栈顶元素出栈,并将其值保存在 e 中。
  • 如果栈为空,则返回 0;否则返回 1 表示出栈成功。
int GetTop(LinkStack s, int *e) {
    if (s != NULL) {
        *e = s->data;
        return 1;
    }
    return 0;
}
  • 获取栈顶元素的值并保存在 e 中。
  • 如果栈为空,则返回 0;否则返回 1 表示获取成功。
void TraverseStack(LinkStack s) {
    StackNode *p = s;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
  • 遍历并输出栈内所有元素的值。

完整代码

#include <stdio.h>
#include <stdlib.h>

typedef struct StackNode {
    int data;
    struct StackNode *next;
} StackNode, *LinkStack;

// 初始化栈
int InitStack(LinkStack *s) {
    *s = NULL; // 将栈顶指针置为空
    return 1;
}

// 入栈操作
int Push(LinkStack *s, int e) {
    StackNode *p = (StackNode *)malloc(sizeof(StackNode));
    if (!p) {
        return 0; // 内存分配失败
    }
    p->data = e;
    p->next = *s;
    *s = p; // 将新节点插入到栈顶
    return 1;
}

// 出栈操作
int Pop(LinkStack *s, int *e) {
    if (*s == NULL) {
        return 0; // 空栈,出栈失败
    }
    *e = (*s)->data;
    StackNode *p = *s;
    *s = (*s)->next;
    free(p); // 释放节点内存
    return 1;
}

// 获取栈顶元素
int GetTop(LinkStack s, int *e) {
    if (s != NULL) {
        *e = s->data;
        return 1;
    }
    return 0; // 空栈,获取失败
}

// 遍历栈内元素并输出
void TraverseStack(LinkStack s) {
    StackNode *p = s;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

int main() {
    LinkStack stack;
    int choice, value, topValue;
    InitStack(&stack);

    while (1) {
        printf("1. 入栈\n");
        printf("2. 出栈\n");
        printf("3. 获取栈顶元素\n");
        printf("4. 遍历栈内元素\n");
        printf("5. 退出\n");
        printf("请选择操作:");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("请输入要入栈的元素:");
                scanf("%d", &value);
                Push(&stack, value);
                break;
            case 2:
                if (Pop(&stack, &value)) {
                    printf("出栈成功,出栈元素为:%d\n", value);
                } else {
                    printf("出栈失败,栈为空\n");
                }
                break;
            case 3:
                if (GetTop(stack, &topValue)) {
                    printf("栈顶元素为:%d\n", topValue);
                } else {
                    printf("栈为空\n");
                }
                break;
            case 4:
                printf("栈内元素为:");
                TraverseStack(stack);
                break;
            case 5:
                printf("程序退出\n");
                exit(0);
            default:
                printf("输入有误,请重新输入\n");
        }
    }

    return 0;
}

相关推荐

  1. 数据结构实现c语言

    2024-03-27 14:08:01       17 阅读
  2. C语言实现基础数据结构——

    2024-03-27 14:08:01       32 阅读
  3. 如何在C语言实现表、和队列等数据结构

    2024-03-27 14:08:01       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-27 14:08:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-27 14:08:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-27 14:08:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-27 14:08:01       20 阅读

热门阅读

  1. 软件工程的相关知识点

    2024-03-27 14:08:01       18 阅读
  2. 使用 React Hooks 管理状态和引用

    2024-03-27 14:08:01       15 阅读
  3. Web开发:深入探讨React Hooks的使用和最佳实践

    2024-03-27 14:08:01       17 阅读
  4. mysql怎么创建索引?

    2024-03-27 14:08:01       15 阅读
  5. Kotlin object

    2024-03-27 14:08:01       14 阅读