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

yizhihongxing

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日

相关文章

  • Redis底层数据结构详解

    Redis底层数据结构详解 前言 Redis是一款开源的,高性能的,基于内存的数据结构存储系统。Redis支持多种数据结构,包括简单的键值对、列表、集合、有序集合等等。本篇文章将深入分析Redis的底层数据结构,介绍它们的原理、优缺点和适用场景。 1. 哈希表(Hash Table) 哈希表是Redis中最常用的底层数据结构之一。可以通过以下命令在Redis…

    数据结构 2023年5月17日
    00
  • Python嵌套式数据结构实例浅析

    Python嵌套式数据结构实例浅析 介绍 在Python中,数据结构是非常重要的。Python中的嵌套数据结构给我们提供了非常灵活的使用方式。例如,我们可以使用嵌套式列表和字典来处理复杂的数据结构问题。在本文中,我将向您介绍Python中嵌套式数据结构的使用方法和示例代码。 嵌套式列表 首先,让我们来看看使用Python中的嵌套式列表。嵌套式列表是列表嵌套的…

    数据结构 2023年5月17日
    00
  • C语言实题讲解快速掌握单链表下

    C语言实题讲解快速掌握单链表下 简介 单链表是常见的一种数据结构,可以存储任意数量的数据,并且可以高效的进行插入、删除和查找操作。本篇文章将介绍如何使用C语言实现单链表,以及如何应对在实现单链表时所遇到的常见问题。 实现过程 数据结构设计 为了实现单链表,我们需要设计一个数据结构来存储节点信息,一般包含两个成员,一个是数据域,用来存储实际的数据,另一个是指针…

    数据结构 2023年5月17日
    00
  • MySQL底层数据结构选用B+树的原因

    MySQL底层数据结构选用B+树的原因主要是因为B+树具有以下优点: 能够快速查找B+树的查找速度非常快,时间复杂度为O(log n),在海量数据的环境中,能够快速定位目标数据。因为B+树每次查找只需要遍历树高度的次数,即使数据量很大,树的高度也很小。 能够高效地进行增删改操作B+树的平衡性能够保证树的高度非常小,大部分操作只需要遍历树的高度,而不是整颗树,…

    数据结构 2023年5月17日
    00
  • java 数据结构单链表的实现

    Java中实现单链表数据结构通常需要以下几个步骤: 1. 定义节点类 首先需要定义一个节点类,用于表示链表中的一个节点。每个节点包含两个属性:data表示节点的数据,next表示节点的下一个节点。这两个属性都需要定义为public,以便后续操作的访问。 public class Node { public int data; public Node next…

    数据结构 2023年5月17日
    00
  • C#数据结构与算法揭秘四 双向链表

    C#数据结构与算法揭秘四 双向链表 简介 本文将讲解如何在C#中实现双向链表。双向链表是一种常用的数据结构,在许多算法中都有广泛应用,它提供了与单向链表不同的灵活性和便利性。 双向链表的实现 创建一个双向节点 双向链表由节点(Node)组成。一个节点包含两个指针:一个指向前一个节点,一个指向后一个节点。由于这两个指针都可能为null,所以我们将它们声明为可空…

    数据结构 2023年5月17日
    00
  • 斜率优化入门

    前言 斜率优化是一种经典的单调队列优化类型,虽然它的名字很高大上,但是其思想内核非常简单,这篇博客就是用来帮助各位快速入门的 提示:本博客以单调队列的思想理解斜率优化 引入 dp 优化可以怎么分类? 数据结构维护决策点集的插入与查找 算法维护决策点集大小,取出无用决策点 而斜率优化 dp 属于第二者,且常常用于优化序列分割问题 Q1 P3195 A1 先列出…

    算法与数据结构 2023年4月17日
    00
  • 浅析Java 数据结构常用接口与类

    浅析 Java 数据结构常用接口与类 本文主要介绍 Java 中常用的数据结构接口和类,可以帮助读者了解和掌握常见的数据结构以及它们的实现方式,从而在日后的开发中使用它们,提高代码的效率和质量。 List 接口 List 接口是 Java 中常用的数据结构接口之一,它代表了一个有序的集合,集合中的每一个元素都可以通过其索引进行访问。List 接口的一些常用方…

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