C语言实现通用数据结构之通用椎栈

C语言实现通用数据结构之通用椎栈

概述

通用椎栈(Generic Linked List Stack),简称GLL Stack,是一种通用的数据结构,能够以动态的方式存储和访问任意类型的数据。GLL Stack 采用链表实现,可以进行进栈(push)、出栈(pop)、查看栈顶元素(peek)、判断栈是否为空(isEmpty)等基本操作。

基本操作

数据结构定义

首先,我们需要定义一个通用的数据结构来存储数据:

typedef struct {
    void *data;
    struct gll_node *next;
} gll_node;

这是通用椎栈链表的节点类型,其中 data 存储了实际的数据,next 指向下一个节点。

typedef struct {
    gll_node *top;
} gll_stack;

这是通用椎栈的定义,其中 top 指向栈顶节点。

进栈(push)

新元素进栈时,需要动态的为其分配内存,并将其插入到栈顶。

void push(gll_stack *stack, void *data) {
    // 分配空间
    gll_node *new_node = (gll_node*) malloc(sizeof(gll_node));
    new_node->data = data;
    // 入栈
    new_node->next = stack->top;
    stack->top = new_node;
}

出栈(pop)

将栈顶元素出栈时,需要从链表中删除该节点,并释放空间。

void *pop(gll_stack *stack) {
    if (isEmpty(stack)) return NULL;
    // 出栈
    gll_node *popped_node = stack->top;
    void *data = popped_node->data;
    stack->top = popped_node->next;
    // 释放空间
    free(popped_node);
    return data;
}

查看栈顶元素(peek)

查看栈顶元素时,只需要返回栈顶节点的数据部分。

void *peek(gll_stack *stack) {
    if (isEmpty(stack)) return NULL;
    return stack->top->data;
}

判断栈是否为空(isEmpty)

判断栈是否为空时,只需检查栈顶指针是否为NULL。

int isEmpty(gll_stack *stack) {
    return (stack->top == NULL);
}

示例

示例1:使用GLL栈实现字符串反转

初始时将字符串中的每个字符依次进栈,最后再将字符依次出栈即可得到反转后的字符串。

#include <stdio.h>
#include <string.h>
#include "gll_stack.h"  // 通用椎栈定义及操作

#define MAX_LEN 100

int main() {
    char str[MAX_LEN];
    printf("请输入一个字符串:");
    scanf("%s", str);

    int len = strlen(str);

    // 字符串依次进栈
    gll_stack stack;
    stack.top = NULL;
    for (int i = 0; i < len; i++) {
        push(&stack, (void*) &str[i]);
    }

    // 字符串出栈
    char reversed_str[MAX_LEN];
    for (int i = 0; i < len; i++) {
        reversed_str[i] = *((char*) pop(&stack)); // 注意要强制类型转换
    }
    reversed_str[len] = '\0';

    printf("反转后的字符串为:%s\n", reversed_str);

    return 0;
}

示例2:使用GLL栈实现十进制数转二进制数

将十进制数依次压入GLL栈,然后依次出栈,并将每个出栈的数字转换为二进制数的一位。最后将所有位拼接起来,即为转换后的二进制数。

#include <stdio.h>
#include "gll_stack.h"  // 通用椎栈定义及操作

int main() {
    int num;
    printf("请输入一个十进制整数:");
    scanf("%d", &num);

    // 转换为二进制数
    gll_stack stack;
    stack.top = NULL;
    while (num != 0) {
        push(&stack, (void*) (num % 2));
        num /= 2;
    }

    // 拼接字符串
    char binary_str[100];
    int i = 0;
    while (!isEmpty(&stack)) {
        int bit = *((int*) pop(&stack));  // 注意要强制类型转换
        binary_str[i] = bit + '0';  // 转换为字符形式
        i++;
    }
    binary_str[i] = '\0';

    printf("转换为二进制数为:%s\n", binary_str);

    return 0;
}

总结

通过实现以上基本操作,我们可以使用GLL Stack 存储和访问任意类型的数据,并使用栈的特性来实现各种业务逻辑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现通用数据结构之通用椎栈 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C、C++线性表基本操作的详细介绍

    我来详细讲解“C、C++线性表基本操作的详细介绍”。 一、线性表的定义 线性表是一种数据结构,它是由n个数据元素组成的有限序列,记为(a1,a2,…,an),其中a1是线性表的第一个元素,an是线性表的最后一个元素。除第一个元素之外,每一个元素有且仅有一个直接前驱元素,除了最后一个元素之外,每一个元素有且仅有一个直接后继元素。 线性表可以理解为一个一维数…

    数据结构 2023年5月17日
    00
  • 图解AVL树数据结构输入与输出及实现示例

    请允许我为您详细讲解“图解AVL树数据结构输入与输出及实现示例”的完整攻略。 标题 AVL树数据结构简介 AVL树是一种平衡二叉搜索树,是由G.M. Adelson-Velsky和E.M. Landis在1962年发明的。它的特点是带有平衡条件,任意节点的左右子树高度差不超过1,通过左旋、右旋、左右旋、右左旋四种形态的调整操作,来维护树的平衡。这样可以保证树…

    数据结构 2023年5月17日
    00
  • Python 数据结构之旋转链表

    Python 数据结构之旋转链表 简介 在进行链表操作时,有时需要旋转链表的一部分,即将链表的最后几个节点移到链表的头部。本文将讲解 Python 实现旋转链表的方法。 方法 我们需要了解两个概念:旋转链表、链表反转。 旋转链表 假设链表为1-2-3-4-5,k=2,将链表后两个节点移动到链表头部,即转化为4-5-1-2-3。 做法如下: 先遍历链表,得出链…

    数据结构 2023年5月17日
    00
  • C语言 结构体数组详解及示例代码

    C语言 结构体数组详解及示例代码 结构体是C语言中最为基础的数据结构之一,它可以将多个数据类型组合成一个整体,方便地进行访问和管理。而结构体数组则是将多个相同结构体类型的变量按照一定规律排列在一起的一种数据结构。本文将详细讲解C语言中结构体数组的使用方法及示例代码。 定义结构体 首先,我们需要定义一个结构体类型。结构体类型需要指定名称、成员变量及其数据类型:…

    数据结构 2023年5月17日
    00
  • C语言深入讲解链表的使用

    C语言深入讲解链表的使用 什么是链表? 链表是一种常用的数据结构,它的存储方式是通过指针相互连接实现的。链表是由若干个节点(node)构成的,每个节点都存储着一些信息和指向下一个节点的指针。 链表实现的基本操作 链表的基本操作包括插入节点、删除节点以及遍历链表。我们下面将通过代码示例详细介绍这些操作。 插入节点 链表的插入节点操作是指在链表的某一位置插入一个…

    数据结构 2023年5月17日
    00
  • C++数据结构之哈希表的实现

    以下是详细的讲解: C++数据结构之哈希表的实现 哈希表的概念 哈希表是一种能够实现快速查找的散列表,通过将关键字映射到哈希表中的一个位置来实现快速查找。哈希表的查询、删除时间复杂度为O(1),操作效率非常高,所以常常被用来对大量数据进行检索。 哈希表的实现 哈希函数 哈希函数的主要作用就是将任意长度的输入数据转化为固定长度的散列值,一般采用对关键字进行取模…

    数据结构 2023年5月17日
    00
  • 详解Java中字典树(Trie树)的图解与实现

    详解Java中字典树(Trie树)的图解与实现 一、什么是字典树(Trie树) 字典树,又称为Trie树,是一种树形数据结构。常用于统计和排序大量的字符串。它支持快速插入和查找,并且可以用于词频统计。 二、字典树的基本性质 根节点不包含字符,除根节点外每个节点都只包含一个字符。 从根节点到某个节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的…

    数据结构 2023年5月17日
    00
  • C++ 数据结构线性表-数组实现

    C++ 数据结构线性表-数组实现 什么是线性表 线性表,简单来说,就是一种有序的数据结构,数据元素起来往往构成一列,比如数组、链表等等。 数组实现线性表 数组是一种容器,它可以存储相同类型的数据元素。使用数组实现线性表,就是将数据元素按照一定的顺序依次存储在数组中。 数组实现线性表的基本思路 定义一个数组,用来存储数据元素; 定义一个变量,用来记录线性表中元…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部