数据结构-符号表

news2024/11/14 15:03:59

1.概述

符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值。

符号表中,键具有唯一性,符号表在实际生活中的使用场景是非常广泛的,见下表:

 2.符号表的特性

  • 键值对存储:符号表通常以键值对的方式存储符号名和相关信息(如类型、值、作用域等)

  • 快速查找:符号表需要支持快速查找操作,以便在编译或执行期间快速获取符号的信息

  • 作用域管理:在某些情况下,符号表需要支持多层作用域,以便处理局部变量和全局变量

  • 动态更新:符号表需要能够动态添加、修改和删除符号

3.代码说明

package main

import (
	"errors"
	"fmt"
)

// Symbol 结构体表示符号的信息
type Symbol struct {
	Name  string      // 符号名称
	Value interface{} // 符号的值
	Type  string      // 符号的类型
}

// SymbolTable 结构体表示符号表
type SymbolTable struct {
	table map[string]*Symbol // 符号名到符号的映射
}

// NewSymbolTable 创建一个新的符号表
func NewSymbolTable() *SymbolTable {
	return &SymbolTable{
		table: make(map[string]*Symbol),
	}
}

// Set 添加或更新符号
func (st *SymbolTable) Set(name string, value interface{}, typeInfo string) {
	st.table[name] = &Symbol{Name: name, Value: value, Type: typeInfo}
}

// Get 查找符号
func (st *SymbolTable) Get(name string) (*Symbol, error) {
	symbol, exists := st.table[name]
	if !exists {
		return nil, errors.New("symbol not found")
	}
	return symbol, nil
}

// Remove 删除符号
func (st *SymbolTable) Remove(name string) {
	delete(st.table, name)
}

// Print 打印符号表的内容
func (st *SymbolTable) Print() {
	for _, symbol := range st.table {
		fmt.Printf("Name: %s, Value: %v, Type: %s\n", symbol.Name, symbol.Value, symbol.Type)
	}
}

func main() {
	// 创建一个新的符号表
	symbolTable := NewSymbolTable()

	// 添加一些符号
	symbolTable.Set("x", 10, "int")
	symbolTable.Set("y", 20.5, "float")
	symbolTable.Set("z", "Hello, World!", "string")

	// 获取并打印符号的值
	if symbol, err := symbolTable.Get("x"); err == nil {
		fmt.Printf("Retrieved: Name: %s, Value: %v, Type: %s\n", symbol.Name, symbol.Value, symbol.Type)
	}

	// 打印整个符号表
	symbolTable.Print()

	// 删除一个符号
	symbolTable.Remove("y")

	// 打印整个符号表
	fmt.Println("After removing y:")
	symbolTable.Print()
}

 代码说明

  1. Symbol 结构体:表示符号的基本信息,包括符号名称、值和类型

  2. SymbolTable 结构体:使用一个 map 来存储符号,键是符号名,值是 Symbol 结构体的指针

  3. NewSymbolTable:创建并返回一个新的符号表实例

  4. Set:添加或更新符号的值和类型

  5. Get:根据符号名查找符号的信息,如果未找到则返回错误

  6. Remove:从符号表中删除指定的符号

  7. Print:打印符号表中所有符号的详细信息

使用示例

        在 main 函数中,创建了一个符号表,添加了几种类型的符号(整型、浮点型和字符串),并打印了它们的信息。然后,我们删除了符号 y 并再次打印符号表的内容。

扩展功能

在实际应用中,符号表的实现可以更加复杂,例如:

  • 支持嵌套作用域(如函数内的局部变量)。
  • 支持类型检查和符号的生命周期管理。
  • 提供更复杂的查询功能,如根据类型好的,我们可以进一步扩展符号表的功能,以支持更复杂的需求。

4. 有序符号表

有序符号表(Ordered Symbol Table)是一种数据结构,通常用于存储键值对,以便能够快速查找、插入和删除操作,同时保持键的有序性。它常用于实现字典、索引等功能。

主要特性

  1. 有序性:符号表中的元素是按照键的顺序存储的,支持范围查询。
  2. 高效的操作:支持高效的查找、插入和删除操作,通常时间复杂度为 O(logn)。

常见实现

有序符号表可以通过以下数据结构实现:

  1. 红黑树:一种自平衡的二叉搜索树,能够保持树的高度为 O(logn),使得查找、插入和删除操作都能在对数时间内完成。

  2. AVL树:另一种自平衡的二叉搜索树,保持严格的平衡条件,确保操作的时间复杂度为 O(logn)。

  3. B树:一种自平衡的树数据结构,适用于大规模数据的存储,常用于数据库和文件系统。

  4. 跳表:一种基于链表的概率性数据结构,支持高效的查找、插入和删除操作。

主要操作

  • 插入(Insert):将一个新的键值对添加到符号表中。
  • 查找(Search):根据键查找对应的值。
  • 删除(Delete):根据键删除对应的键值对。
  • 最小值/最大值(Min/Max):返回符号表中最小或最大的键。
  • 范围查询(Range Query):返回某一范围内的所有键值对。

应用场景

  • 数据库索引
  • 语言的符号解析
  • 实现有序集合等数据类型

示例

以下是一个简单的红黑树实现的有序符号表的伪代码示例:

class OrderedSymbolTable:
    def __init__(self):
        self.root = None  # 红黑树的根节点

    def insert(self, key, value):
        # 实现红黑树的插入操作
        pass

    def search(self, key):
        # 实现红黑树的查找操作
        pass

    def delete(self, key):
        # 实现红黑树的删除操作
        pass

    def min(self):
        # 返回最小键
        pass

    def max(self):
        # 返回最大键
        pass

    def range_query(self, low, high):
        # 返回范围内的所有键值对
        pass

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2099031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

扮猪吃老虎的电脑机箱,不到300块的追风者XT523静音版开箱赏析

扮猪吃老虎的电脑机箱,不到300块的追风者XT523静音版开箱赏析 哈喽小伙伴们好,我是Stark-C~ 最近办公室的老大需要我帮忙挑选一款电脑机箱,除了可以日常办公,闲暇之余还需要用这台电脑打打游戏,要求是噪音越小越好且…

Cesium加载高速公路样式线图层和利用CSS撰写高速公路样式

在ArcGIS软件中是将多个线图层叠加(宽的叠加在下方防止遮盖其他图层) 依照此想法在Cesium中加载高速公路线图层时 在 Cesium 中,直接设置线(如 Polyline)的样式为“高速公路样式”并不直接支持,因为 Cesiu…

奥yùn会节目很精彩!想看直播?

有没有可以在电视上安装,然后看直播的软件呢?答案肯定的。 资源在这(点我) 嗯,废话不多说了。 正文开始 安装教程 保证文件的后缀名为.apk 然后把它复制到U盘根目录,再接入到电视上。 在电视上用文件管…

解决windterm莫名其妙输入ctrl+c的问题

原来是钉钉在监控你的鼠标,取消设置即可 来源:https://github.com/kingToolbox/WindTerm/issues/2296

每一次逾越都是不可替代的成长![我是如何克服编程学习过程中的挫折感】

成长路上不孤单😊【14后,C爱好者,持续分享所学,如有需要欢迎收藏转发😊😊😊😊😊😊😊!!!!&#xff…

logging | 项目开发中日志模块logging在整个工程中的应用

日志模块 日志介绍1. logging使用场景设置级别 2. 实际logging使用 - 学习版2.1 终端输出StreamHandler2.2 日志文件中输出FileHandler2.3 同时写入终端和文件2.4 .Formatter参数语句 3. 封装logging模块 - 实战版 ⭐3.1 配置config文件夹下project_config.py文件time模块 3.2 …

Linux日志-btmp日志

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux进阶部分又分了很多小的部分,我们刚讲完了Linux基础软件,下面是Linux日志。Linux 系统中的日志是记录系统活…

正向代理、反向代理

代理作为客户端和服务器的中间层,按照不同的维度可以分为不同的类型。 一种常见的划分方式是将代理分为正向代理(forward proxy)与反向代理(reverse proxy)。 根据实现代理的方式可以分为 HTTP 隧道代理、MITM 代理、…

ubuntu安装dnsmasq 做dns服务器

本文介绍在ubuntn22.04上安装dnsmasq用做自定义域名服务器,可以在公网上使用。 目标 准备两台不是同一个局域网内的服务器,其中A服务器是ubuntu22.04。在A上安装dnsmasq dns服务器,配置自定义域名,然后在B服务器上配置A做为dns服…

使用session实现单用户多端登录限制

基本流程: 首先获得当前浏览器访问服务器的session,然后根据用户的信息(如id等)在redis中查找,如果找到,并且和查找对应的session不同,则可以判断已经有其他设备登录过了,这个时候就…

Andorid 如何查看某个.so库的依赖

Android 手机中,如何查看其中某个.so 库依赖了其它哪些库?1.方法:使用android 手机中的readelf 命令.。2. 操作步骤:如查看libdolphin.so 的的依赖。 (1)adb shell 进入手机,进入libdolphin.so…

C++学习笔记----6、内存管理(一)---- 使用动态内存(2)

2.2、我的好朋友malloc怎么样了? 如果你是一个C程序员,对啦,我就是,你可能会想,malloc()函数怎么样了。在C语言中,malloc()用于分配一定数量的内存字节。总的来讲,使用malloc()简单直接。在C中m…

传统CV算法——图像特征算法之角点检测算法

文章目录 2. 角点检测2.1 角点概述2.1.1 概念2.1.2 角点的特点2.1.3 角点的检测2.1.4 角点的应用 2.2 角点检测算法2.2.1 Harris 角点2.2.1.1 Harris 角点介绍2.2.1.2 Harris计算流程1. 图像梯度2. 结构张量3. Harris响应函数4. 非极大值抑制5. 阈值化 2.2.1.3 Harris性质1. 旋…

《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(4)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(3) 7.1 数据链路层的组成结构 7.1.1 数据链路层的状态 数据链路层需要通过物理层监控PCIe链路的状态,并维护数据链路层的“控制与…

厂房电气火灾现场勘验要点

0前言 随着我国社会的发展,电气化水平提升,但随之而来的是频繁的电气火灾事故,对生活和生产造成重大危害。电气火灾是最常见的火灾类型,通常由电路短路、电压过高、电阻过大或电路超负荷引起,这些因素都可能导致火花并…

电脑怎么录屏?探索电脑录屏工具,三款高效工具推荐及使用指南

在数字化时代,电脑录屏已成为日常工作和学习中不可或缺的一部分。无论是制作教程、记录会议还是捕捉游戏精彩瞬间,一个好的录屏工具都能让这一切变得简单高效。今天,我们将为您介绍三款备受推崇的录屏软件:Windows自带的步骤记录器…

面向对象程序设计之链表 list 的简析(C++)

简介:链表是一个双向的结构,与string与vector不同的是他不支持[]访问,因为链表是由一个节点一个节点连接而成的,并不连续。我们可以在常数量级内对于链表进行插入与删除数据 1.构造函数 我们在cplusplus.com中可以查到链表总共有四…

无人机遥控器的材料组成!!!

1. 外壳 材料:遥控器外壳通常采用高强度塑料(如ABS、PC等)或轻质金属(如铝合金)制成。这些材料具有良好的抗冲击性、耐磨性和一定的耐腐蚀性,能够保护内部电子元件免受外界环境的影响。 特点:…

智能优化算法-秃鹰优化算法(BES)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍: 秃鹰搜索算法‌,它是一种基于自然界中秃鹰觅食行为启发的优化算法,旨在解决优化问题。该算法模仿了秃鹰在寻找猎物时的策略,结合了随机搜索和逐步优化的特点&#…

AGI系列(9)手把手带你玩转 Coze 画板节点

本文以智能体“日签卡片生成器”的制作来阐述 Coze 画板节点的使用方法。 效果演示 核心流程 日签卡片生成器工作流整体分为两部分: 工作流:其核心流程为通过用户输入的主题词生成卡片的标题、内容 图像流:通过LLM输出的内容在图像流完成卡…