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日

相关文章

  • Java数据结构之优先级队列(堆)图文详解

    Java数据结构之优先级队列(堆)图文详解 什么是优先级队列(堆) 优先级队列(堆)是一种非常重要的数据结构,它能够更好地管理数据,分配任务等。优先级队列的本质就是一种特殊的队列,它是一种可以根据元素的优先级来出队的数据结构。 通常情况下,队列中存储了一系列具有优先级的数据。当我们从队列中取出元素时,优先级高的元素会先出队。因此,我们需要一种数据结构,来对这…

    数据结构 2023年5月17日
    00
  • C++数据结构关于栈迷宫求解示例

    C++数据结构关于栈迷宫求解示例攻略 在本篇攻略中,我们将使用C++数据结构中的栈来解决迷宫问题,具体将通过两个示例来详细讲解该方法。首先介绍一下栈的概念。 栈的概念 栈是一种“后入先出”的数据结构,即最后压入栈中的元素会首先被弹出,而最早压入栈中的元素会最后被弹出。栈的基本操作有入栈(push)、出栈(pop)、判断是否为空以及读取栈顶元素等。 迷宫问题 …

    数据结构 2023年5月17日
    00
  • C++实现数据结构的顺序表详解

    C++实现数据结构的顺序表详解 介绍 在进行程序开发时,常常需要对数据进行存储和操作。其中一种数据结构是顺序表,它提供了一种在内存中线性存储数据的方法,能够方便地对数据进行插入、删除、查找等操作。本文将详细介绍如何使用C++实现数据结构的顺序表,帮助读者掌握顺序表的创建、插入、删除、查找等操作。 创建顺序表 顺序表可以使用数组来实现。下面的代码展示了如何创建…

    数据结构 2023年5月17日
    00
  • C++高级数据结构之优先队列

    C++高级数据结构之优先队列 什么是优先队列? 优先队列是一种特殊的队列,其中每个元素都有一个优先级。当加入一个元素时,它会被放置在队列中的适当位置,以确保优先级最高的元素位于队头。从队列中取出元素时,总是从队头删除元素。 优先队列的应用 优先队列的常见应用场景包括: 操作系统任务调度 网络传输协议TCP中的拥塞控制算法 各种图像算法如边缘检测等 C++中S…

    数据结构 2023年5月17日
    00
  • C语言数据结构实现银行模拟

    C语言数据结构实现银行模拟攻略 背景介绍 银行模拟是计算机学科中一个重要的数据结构实践练习项目。它涉及到队列(Queue)等数据结构的应用,也是计算机基础课程的一个重要组成部分。 代码实现 1. 队列的实现 首先,我们需要实现一个队列(Queue)结构体,包含 QueueSize、Front、Rear 三个成员变量: struct Queue { int Q…

    数据结构 2023年5月17日
    00
  • Java数据结构顺序表的详细讲解

    Java数据结构顺序表的详细讲解 什么是顺序表? 顺序表是一种线性结构,它通过一段连续的存储空间来存储一组元素,每个元素占用一个固定大小的存储单元,元素之间按照一定的顺序紧密排列。 顺序表的实现 在Java中,顺序表可以通过数组实现。数组是一种非常基础的数据结构,它可以用来存储相同类型的数据,数组元素的地址是连续的,因此可以通过下标访问数组中的元素。 实现步…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之前缀,中缀和后缀表达式

    带你了解Java数据结构和算法之前缀、中缀和后缀表达式 1. 前缀表达式(Prefix Expression) 前缀表达式是指运算符位于操作数之前的表达式,也被称为波兰式。前缀表达式的优点在于,每个运算符的优先级都可以通过括号来明确,不需要考虑运算符的优先级。同时,整个表达式的意义也可以很清晰地传达。 举个例子,下面是一个前缀表达式: + * 4 5 6 /…

    数据结构 2023年5月17日
    00
  • c语言数据结构之并查集 总结

    C语言数据结构之并查集总结 简介 并查集,也称作不相交集合,是一种树型的数据结构。并查集用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。 并查集只有两个操作: find:确定某个元素属于哪个子集。它可以被用来确定两个元素是否属于同一子集。 union:将两个子集合并成同一个集合。 基本实现 以快速查找find和…

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