从字符流中查找第一个非重复字符

17 Mar 2025 | 4 分钟阅读

引言

在数据处理和算法问题解决领域,从字符流中查找第一个不重复的字符是一个有趣的挑战。这项工作对于许多应用都很重要,例如自然语言处理和实时数据处理。手头的任务是在连续的字符流中找到第一个不重复的字符。例如,当读取文本文件或从实时数据源获取数据时,流意味着一系列字符随着时间的推移一个接一个地出现。目标是根据迄今为止遇到的字符,快速识别流中第一个唯一的字符。

查找第一个不重复的字符很重要,因为它可以应用于现实生活中的情况。例如,在自然语言处理中,当识别文本流中的独特单词或字符时,这个问题可能至关重要。此外,在数据持续流式传输的情况下,如网络通信或日志处理,识别第一个不重复的字符对于迅速决策至关重要。

代码

输出

Find the first non-repeating character from a stream of characters

代码解释

头文件

  • 代码中包含了必需的头文件:用于标准输入输出函数的 stdio.h 和用于内存分配函数的 stdlib.h。

宏定义

  • NO_OF_CHARS 的定义是 256,这是可以使用的 ASCII 字符的总数。这个宏用于指定数据结构和数组的大小。

双向链表节点结构

  • struct DLLNode 代表双向链表节点。它包含一个字符(ch),以及指向前一个节点(prev)和下一个节点(next)的指针。

插入函数 (insertAtEnd)

  • insertAtEnd 函数将一个带有字符 x 的新节点添加到双向链表的末尾(在头节点之后)。
  • 新节点的内存是动态分配的,其字符和指针被设置好,并且头节点和前一个节点的指针会被相应地更新。

删除函数 (deleteNode)

  • deleteNode 函数可以从双向链表(head_ref)中移除一个给定的节点(del)。
  • 它通过修改该节点之前和之后的节点的指针,释放被删除节点所使用的内存。

第一个不重复字符函数 (firstNonRepeating)

  • firstNonRepeating 函数使用一个数组和一个双向链表来处理字符流,并确定哪个字符是第一个不重复的字符。
  • 它维护一个名为 inDLL 的数组,用于记录每个字符在双向链表中的位置。
  • 它使用一个名为 charCount 的数组来计算每个字符的出现次数。
  • 对于流中的每个字符,它会更新计数,并根据该字符是否重复来采取相应操作。
  • 接下来,打印出第一个不重复的字符。

主函数 (main)

  • 主函数使用 "abacabad" 作为输入流,初始化一个字符数组(stream)。
  • 它调用 firstNonRepeating 函数来查找并打印流中的第一个不重复字符。

输出

  • 程序会输出处理的每个阶段,包括正在处理的字符、任何已删除的字符,以及在每个阶段找到的第一个不重复字符。

内存管理

  • 代码使用 malloc 为双向链表中的新节点动态分配内存。
  • 使用 free 函数释放被删除节点所使用的内存。