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日

相关文章

  • GPS北斗卫星时间同步系统助力电力自动化网络系统

    GPS北斗卫星时间同步系统助力电力自动化网络系统 GPS北斗卫星时间同步系统助力电力自动化网络系统 京准电子官微——ahjzsz 前言 近几年来,随着电力自动化水平的提高,在电力中计算机监控系统、微机保护装置、微机故障录波装置以及各类数据管理机得到了广泛的应用,而这些自动装置的配合工作需要有一个精确统一的时间。当电力系统发生故障时,既可实现全站各系统在统一时…

    算法与数据结构 2023年5月8日
    00
  • Java数据结构之最小堆和最大堆的原理及实现详解

    Java数据结构之最小堆和最大堆的原理及实现详解 什么是堆? 堆是一种特殊的树形数据结构,它满足以下两个条件: 堆是一个完全二叉树,即除了最后一层,其他层都必须填满,最后一层从左到右填满 堆中每个节点的值必须满足某种特定的条件,例如最小堆要求每个节点的值都小于等于其子节点的值。 堆一般分为两种类型:最小堆和最大堆。 最小堆:每个节点的值都小于等于其子节点的值…

    数据结构 2023年5月17日
    00
  • java编程队列数据结构代码示例

    下面是“Java编程队列数据结构代码示例”的完整攻略。 什么是队列 队列是一种有序的数据结构,特点是先进先出(FIFO)。队列中不管是插入操作还是删除操作,都是在队列的两端进行的,插入操作在队列的尾部进行,删除操作在队列的头部进行。队列的一个重要用途是在计算机的操作系统中,实现进程和所有需要等待资源的实体之间的交互。 队列的实现 队列数据结构可以采用数组或链…

    数据结构 2023年5月17日
    00
  • 手写 Vue3 响应式系统(核心就一个数据结构)

    下面是手写 Vue3 响应式系统的完整攻略。 1. 概述 Vue3 的响应式系统使用了 Proxy 对象来监测对象的变化,相较于 Vue2 的响应式系统使用 Object.defineProperty 进行数据劫持,Proxy 具有更好的性能和更简洁的 API。 当我们修改 Vue3 中的 reactive 对象内部的数据时,就会触发依赖收集和派发更新的操作…

    数据结构 2023年5月17日
    00
  • C++超详细讲解单链表的实现

    首先我们来了解一下单链表的概念。 单链表是一种常见的数据结构,在计算机科学中被广泛使用。它是由节点所组成的数据结构,其中每个节点都包含两部分,一个是存储数据的元素,另一个是指向下一个节点的指针。单链表的首节点被称为头部,而最后一个节点则被称为尾部。单链表可以通过在头部插入和删除元素来实现高效地数据操作。接下来我们将讲解如何实现一个 C++ 版的单链表。 实现…

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

    数据结构 2023年5月17日
    00
  • C++数据结构之堆详解

    C++数据结构之堆详解 什么是堆 堆是一种完全二叉树。 堆分为大根堆和小根堆,大根堆满足每个节点的值都大于等于它的子节点,小根堆满足每个节点的值都小于等于它的子节点。 堆的实现 常见的实现堆的方式有数组和链表两种。 数组 由于二叉堆是完全二叉树,所以可以用数组来实现: 对于一个节点i,它的左子节点的下标是2 * i + 1,右子节点的下标是2 * i + 2…

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