systemverilog/verilog文件操作

1、Verilog文件操作

        Verilog具有系统任务和功能,可以打开文件、将值输出到文件、从文件中读取值并加载到其他变量和关闭文件。

1.1 、Verilog文件操作

1.1.1、打开和关闭文件

module tb;
// 声明一个变量存储 file handler
integer fd;
initial begin
// 以写权限打开一个文件名为 "my_file.txt" 的新文件,并将文件柄指针存储在变量"fd"中
    fd = $fopen("my_file.txt", "w");
// 关闭指向 "fd"的文件柄
    $fclose(fd);
end
endmodule

文件操作选项:

1.1.2、写文件

        每个系统函数都以基数十进制打印值。它们还有其他三个版本,可以以二进制、八进制和十六进制打印。

integer handle1;
initial begin
handel1=$fopen("picture_out.txt","w");
forever @(posedge clk) begin
    if(PicInHEnd &PicInVEnd) begin
        $fclose(handle1);
        $finish;
    end
end
end
always@(posedge clk) begin
    if(  PicOutVld  ) begin
        if(PicInHEnd)
            $fwrite(handle1,"%h",PicInData,"\n");
        else
            $fwrite(handle1,"%h",PicInData,"\n");
    end
end

使用方法如下:
 

module tb;
integer fd;
integer i;
reg [7:0] my_var;
initial begin
  // Create a new file
  fd = $fopen("my_file.txt", "w");
  my_var = 0;
   $fdisplay(fd, "Value displayed with $fdisplay");
  #10 my_var = 8'h1A;
  $fdisplay(fd, my_var); // Displays in decimal
  $fdisplayb(fd, my_var); // Displays in binary
  $fdisplayo(fd, my_var); // Displays in octal
  $fdisplayh(fd, my_var); // Displays in hex
  // $fwrite does not print the newline char '' automatically at
   // the end of each line; So we can predict all the values printed
   // below to appear on the same line
   $fdisplay(fd, "Value displayed with $fwrite");
  #10 my_var = 8'h2B;
  $fwrite(fd, my_var);
  $fwriteb(fd, my_var);
  $fwriteo(fd, my_var);
  $fwriteh(fd, my_var);
   // Jump to new line with '', and print with strobe which takes
   // the final value of the variable after non-blocking assignments
   // are done
   $fdisplay(fd, "Value displayed with $fstrobe");
  #10 my_var <= 8'h3C;
  $fstrobe(fd, my_var);
  $fstrobeb(fd, my_var);
  $fstrobeo(fd, my_var);
  $fstrobeh(fd, my_var);
   #10 $fdisplay(fd, "Value displayed with $fmonitor");
   $fmonitor(fd, my_var);
  for(i = 0; i < 5; i= i+1) begin
    #5 my_var <= i;
  end
   #10 $fclose(fd);
end
endmodule

1.1.3、读取文件

1.1.3.1、文件读取:$fscanf和$readmemh

其中$readmemh的作用是一次性将文件中的数据读取到某个数组中,然后一次从数组中读取1个数组进行处理,而$fscanf的作用是从文件中读取一行数据。

        在verilog中,$fscanf函数用于从文件中读取格式化的数据,他的语法如下:

$fscanf(file ,format ,variable);

其中:
file:表示一个整数变量,表示要读取的文件句柄
format:是一个字符串,指定读取数据的格
variable:是一个变量,用于存储从文件中读取的数据
$fscanf函数将根据指定的文件中读取数据,并将其存储在变下是一些常见的格式说明符
%h:十六进制表示的整数
%d:十进制表示的整数
%b:二进制表示的整数
%f:浮点数。
以下演示如何使用$ fscanf函数从文件中读取十六进制
 

module file_reader;
  reg [7:0] data;
  reg clk;
  integer file;
  initial begin
    // 打开文件
    file = $fopen("input.txt", "r");   
    if (file == 0) begin
      $display("无法打开文件");
      $finish;
    end
    // 模拟时钟
    clk = 0;
    forever #5 clk = ~clk;
  end
  
  always @(posedge clk) begin
    // 读取文件中的数据
    if (!$feof(file)) begin
      $fscanf(file, "%h", data);
      $display("读取数据:%h", data);
    end
    else begin
      $display("文件读取完毕");
      $fclose(file);
      $finish;
    end
  end
  
endmodule

        在此例中, Verilog模块 file reader使用$ fopen函数打开名为" input tx'的文件,并按照每个时钟周期读取文件的数据。使用 sfscanf函数从文件中读取十六进制数,并使用 display函数打印读取到的数据。每当读取到一个数据时,它将使用 Display函数打印出来。当文件读取完毕时,它将关闭文件并结束仿真。请确保在使用此代码之前,将文件" input. txt"放在与 Verilog源代码相同的目录中,并在文件中包含要读取的数据。

1.1.3.2、读取文件
在 Verilog 中,$readmemh 是一个系统任务,用于从文件中读取十六进制数据并将其加载到内存中。它的语法如下:


$readmemh(filename, memory);
其中:

filename 是一个字符串,表示要读取的文件名。
memory 是一个内存数组或寄存器数组,用于存储从文件中读取的数据。
$readmemh 任务会打开指定的文件,并按行读取文件中的十六进制数据。它会将数据加载到 memory 数组中,每行数据对应数组的一个元素。

以下是一个示例,演示如何使用 $readmemh 任务从文件中读取十六进制数据:


module file_reader;

  reg [7:0] memory [0:9]; // 定义一个包含10个元素的内存数组

  initial begin
    $readmemh("input.txt", memory); // 从文件中读取数据并加载到内存数组中

    // 打印内存数组中的数据
    for (integer i = 0; i < 10; i = i + 1) begin
      $display("memory[%0d] = %h", i, memory[i]);
    end

    $finish;
  end

endmodule

在此示例中,我们通过$ readmemh任务从文件"input"中读取数据,并将其加载到内存数组 memory中。然后,我们使用循环打印出 memory数组中的数据。" input. txt"需要放在与 Verilog源代码相同的目录中,并在文件中包含要读取的十六进制数据(每行一个)

3.1.1.3、

        使用 Verilog的fget函数输入文件读取功能,逐行读取文件内容并将其存储在寄存器或内存。

3.1.1.4、读取一行:

        系统函数$ fgets从fd指定的文件中将字符读入变量str直到st被填满,或者读取换行符并传输到st,或者遇到EOF条件。如果在读取过程中发生错误,则返回代码零。否则返回读取的字符数。以下是—个示例代码,演示如何逐行读取文件并将其存储在寄存器。

module file_reader;

  reg [7:0] data [0:9]; // 定义一个包含10个元素的寄存器数组
  reg [7:0] temp;
  integer file;
  integer line_num;
  initial begin
    // 打开文件
    file = $fopen("input.txt", "r");
    if (file == 0) begin
      $display("无法打开文件");
      $finish;
    end
    line_num = 0;
    // 逐行读取文件
    while (!$feof(file)) begin
      $fgets(temp, file);
      data[line_num] = temp; // 将读取到的数据存储在寄存器中
      line_num = line_num + 1;
    end
    $fclose(file);
    // 打印寄存器中的数据
    for (integer i = 0; i < 10; i = i + 1) begin
      $display("data[%0d] = %h", i, data[i]);
    end
    $finish;
  end
endmodule

        在此示例中,我们定义了一个包含10个元素的寄存器数组data,用于存储从文件中读取的每一行数据。使用$ fgets函数逐行读取文件,并将读取到的数据存储在temp变量中。然后,将temp的值存储在data数组的相应索引位置上。最后,我们使用循环打印出data数组中的数据请确保在使用此代码之前,将文件"inpυt.txt"放在与 Verilog源代码相同的目录中,并在文件中包含要读取的数据。

1.1.3.1、检测EOF

        当找到EOF时,系统函数$feof返回一个非零值,否则对于给定的文件描述符作为参数返回零。

module tb;
reg[8*45:1] str;
integer fd;
initial begin
 fd = $fopen("my_file.txt", "r");
 // Keep reading lines until EOF is found
 while (! $feof(fd)) begin
 // Get current line into the variable 'str'
 $fgets(str, fd);
 // Display contents of the variable
 $display("%0s", str);
 end
 $fclose(fd);
end
endmodule
1.1.3.2 、display的多个参数

        当给$display多个变量是按给定的顺序一个接一个地打印所有变量,没有空格。

module tb;

 reg [3:0] a, b, c, d;
 reg [8*30:0] str;
 integer fd;
 initial begin
 a = 4'ha;
 b = 4'hb;
 c = 4'hc;
 d = 4'hd;
 fd = $fopen("my_file.txt", "w");
 $fdisplay(fd, a, b, c, d);
 $fclose(fd);
 end
endmodule

1.1.4将数据格式化为字符串

        系统函数中的第一个参数$sformat是放置结果的变量名。第二个参数是 Eformat string,它告诉如何将以下参数格式化为字符串。

module tb;
reg [8*19:0] str;
reg [3:0] a, b;
initial begin
a = 4'hA;
b = 4'hB;
// Format 'a' and 'b' into a string given
// by the format, and store into 'str' variable
$sformat(str, "a=%0d b=0x%0h", a, b);
$display("%0s", str);
end
endmodule

2、systemverilog文件操作

2.1.1、打开关闭文件

        $fopen系统函数打开文件进行读取或者写入,该任务将返回一个成为文件描述符的32位整数句柄,这个句柄应该用于读取和写入该文件,
直到它被关闭。
        $fclose系统任务用于关闭文件,一旦文件描述符关闭,就不允许进一步读取或写入文件描述符。
        例如:在下面的代码中,声明一个名为fd的int变量来保存文件描述符。fd最初为零,并从$fopen()中获取有效值,可以检查文件是否成功打开,该文件最终在执行$fclose()时关闭。
 

module tb;
 initial begin
 // 1. Declare an integer variable to hold the file descriptor
   int fd;
 // 2. Open a file called "note.txt" in the current folder with a "read permission
 // If the file does not exist, then fd will be zero
   fd = $fopen ("./note.txt", "r");
     if (fd) $display("File was opened successfully : %0d", fd);
     else $display("File was NOT opened successfully : %0d", fd);
 // 2. Open a file called "note.txt" in the current folder with a "write permission
 // "fd" now points to the same file, but in write mode
     fd = $fopen ("./note.txt", "w");
     if (fd) $display("File was opened successfully : %0d", fd);
     else $display("File was NOT opened successfully : %0d", fd);
 // 3. Close the file descriptor
     $fclose(fd);
 end
endmodule

1.1.2、以读取和附加模式打开

        默认情况下,文件以写入w模式打开。通过提正确的模式类型,也可以在其他模式下打开文件。下表显示可以打开文件的所有不同模式例子:在下面的代码中,我们将看到如何使用上表中描述的不同文件访问模式。

module tb;
 initial begin
 int fd_w, fd_r, fd_a, fd_wp, fd_rp, fd_ap;
 fd_w = $fopen ("./todo.txt", "w"); // Open a new file in write mode a
 fd_r = $fopen ("./todo.txt", "r"); // Open in read mode
 fd_a = $fopen ("./todo.txt", "a"); // Open in append mode
 if (fd_w) $display("File was opened successfully : %0d", fd_w);
 else $display("File was NOT opened successfully : %0d", fd_w)
 if (fd_r) $display("File was opened successfully : %0d", fd_r);
 else $display("File was NOT opened successfully : %0d", fd_r)
 if (fd_a) $display("File was opened successfully : %0d", fd_a);
 else $display("File was NOT opened successfully : %0d", fd_a)
 // Close the file descriptor
 $fclose(fd_w);
 $fclose(fd_r);
 $fclose(fd_a);
 end
endmodule

2.1.3、读取和写入文件

        文件应以写入w模式或附加a模式打开。系统任务如 $fdisplay和 $fwrite0可用于将格式化字符串写入文件这些任务的第一个参数是文件描述符句柄,第二个参数是要存储的数据。要读取文件,必须以读取r模式或读写r+模式打开它。$ fgets()系统任务,它将从文件中读取一行。如果这个任务被调用10次,那么它将读取10。

        例子:下面显示的代码演示了如何使用 $display。然后以读取模式打开文件,并使用$ fgets()本地变量将内容读然后使用标准显示任务 $display打印出来。

module tb;
 int fd; // Variable for file descriptor handle
 string line; // String value read from the file
 initial begin
 // 1. Lets first open a new file and write some contents into it
 fd = $fopen ("trial", "w");
 // Write each index in the for loop to the file using $fdisplay
 // File handle should be the first argument
 for (int i = 0; i < 5; i++) begin
 $fdisplay (fd, "Iteration = %0d", i);
 end
 // Close this file handle
 $fclose(fd);
 // 2. Let us now read back the data we wrote in the previous step
 fd = $fopen ("trial", "r");
 // Use $fgets to read a single line into variable "line"
 $fgets(line, fd);
 $display ("Line read : %s", line);
 // Get the next line and display
 $fgets(line, fd);
 $display ("Line read : %s", line);
 // Close this file handle
 $fclose(fd);
 end
endmodule

2.1.4、阅读直到文件结束

        在前面的示例中,$fgets()两次使用系统任务从文件中读取两行。 Systemverilog有另一个任务调用$feof(),当到达文件未尾时返回tue。这可以在循环中使用,如下所示以读取文件的全部内容。例子。
 

module tb;
 int fd; // Variable for file descriptor handle
 string line; // String value read from the file
 initial begin
 // 1. Lets first open a new file and write some contents into it
 fd = $fopen ("trial", "w");
 for (int i = 0; i < 5; i++) begin
 $fdisplay (fd, "Iteration = %0d", i);
 end
 $fclose(fd);
 // 2. Let us now read back the data we wrote in the previous step
 fd = $fopen ("trial", "r");
 while (!$feof(fd)) begin
 $fgets(line, fd);
 $display ("Line: %s", line);
 end
 // Close this file handle
 $fclose(fd);
 end
endmodule

2.2.5、解析值的行

        System Verilog有另一个名为的系统任务 Sfscanf(),它允许我们扫描并获取某些值。
 

module tb;
 int fd; // Variable for file descriptor handle
 int idx;
 string str;
 initial begin
 // 1. Lets first open a new file and write some contents into it
 fd = $fopen ("trial", "w");
 for (int i = 0; i < 5; i++)
 $fdisplay (fd, "Iteration = %0d", i);
 $fclose(fd);
 // 2. Let us now read back the data we wrote in the previous step
 fd = $fopen ("trial", "r");
 // fscanf returns the number of matches
 while ($fscanf (fd, "%s = %0d", str, idx) == 2) begin
 $display ("Line: %s = %0d", str, idx);
 end
 // Close this file handle
 $fclose(fd);
 end
endmodule

2.1.6、多通道文件描述符

        mcd是一个32位压缩数组值,其中设置打开哪个文件。mcs的LSB总是指标准输出。输向到使用多通道描述符打开的两个或多个文件,方法是将它们的mcd按位或运算在写入结果值。

3、范围解析运算符::

        范围解析运算符∷用于引用类范围内的标识符。范围解析运算符∷的左侧应该是类类型名称、包名称、覆盖组类型名称、覆盖点或交叉名称、 typedef名称。运算符的右侧应该是_个标识符,如变量或方法名称。

3.1、使用范围解析运算符原因

        类和其他作用域可以具有相同的标识符名称,并且如果在未指定作用域的情况下被引用,则可能会产生命名空间冲突。范围解析运算符∷唯一标识给定类的成员或参数。它们还用于从类外部访问类的静态变量和方法、参数和局部参数。它还允许从子类中访问基类的公共和受保护成员。

3.1.1、定义外部函数

class ABC;
int data;
extern virtual function void display();
endclass
// Definition of an external function using scope
// resolution operator
function void ABC::display();
$display("data = 0x%0h", data);
endfunction
module tb;
initial begin
ABC abc = new();
abc.data = 32'hface_cafe;
abc.display();
end
endmodule

3.1.2、访问静态方法和函数

class ABC;

static int data;

static function void display();

$display("data = 0x%0h", data);

endfunction

endclass

module tb;
initial begin
 ABC a1, a2;
 // Assign to static variable before creating
 // class objects, and display using class_type and
 // scope resolution operator
ABC::data = 32'hface_cafe;
ABC::display();
 a1 = new();
 a2 = new();
 $display ("a1.data=0x%0h a2.data=0x%0h", a1.data, a2.data);
end
endmodule

3.1.3、使用包

package my_pkg;
typedef enum bit {FALSE, TRUE} e_bool;
endpackage
module tb;
 bit val;
 initial begin
 // Refer to types that have been declared
 // in a package. Note that package has to
 // be included in compilation but not
 // necessarily "imported"
 val = my_pkg::TRUE;
 $display("val = 0x%0h", val);
 end
endmodule

3.1.4、避免命名空间冲突

package my_pkg;
typedef enum bit {FALSE, TRUE} e_bool;
endpackage
import my_pkg::*;
module tb;
 typedef enum bit {TRUE, FALSE} e_bool;
 initial begin
 e_bool val;
// Be explicit and say that TRUE from my_pkg
 // should be assigned to val
 val = my_pkg::TRUE;
 $display("val = 0x%0h", val);
 // TRUE from current scope will be assigned to
 // val
 val = TRUE;
 $display("val = 0x%0h", val);
 end
endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机vcruntime140.dll丢失要怎么解决,快速解决dll报错问题

在计算机系统中&#xff0c;vcruntime140.dll是一个至关重要的动态链接库文件&#xff08;DLL&#xff09;&#xff0c;它是Visual C Redistributable运行时组件的重要组成部分。这个特定的.dll文件承载了大量的运行时函数和资源&#xff0c;对于许多基于Windows的应用程序来说…

基于动态顺序表实现通讯录项目

本文中&#xff0c;我们将使用顺序表的结构来完成通讯录的实现。 我们都知道&#xff0c;顺序表实际上就是一个数组。而使用顺序表来实现通讯录&#xff0c;其内核是将顺序表中存放的数据类型改为结构体&#xff0c;将联系人的信息存放到结构体中&#xff0c;通过对顺序表的操…

【微服务核心】ZooKeeper

文章目录 1. 简介2. 下载与安装2.1 单机版2.2 集群版 3. 选举机制3.1 首次启动3.2 非首次启动 4. 客户端常用命令行操作4.1 查看节点信息4.2 节点类型4.3 监听器原理4.4 写数据流程 5. 编程实现监听服务动态上下线6. 分布式锁6.1 手写简易分布式锁6.2 Curator 框架 7. 进阶知识…

python对象方法 反射

前言 类实例化得到的对象可以直接调用类中定义的函数&#xff0c;并且可以将对象本身作为第一个参数&#xff0c;那么类能不能也能像对象一样使用类体中的函数而不需要传递第一个参数呢&#xff1f;如果我们使用别人封装好的类&#xff0c;如何判断这个类或者对象是否有某个属…

未来 AI 可能给哪些产业带来哪些进步与帮助?

AI时代如何要让公司在创新领域领先吗&#xff1f;拥抱这5种创新技能&#xff0c;可以帮助你的公司应对不断变化。包括人工智能、云平台应用、数据分析、 网络安全和体验设计。这些技能可以帮助你提高业务效率、保护公司知识资产、明智决策、满足客户需求并提高销售额。 现在就加…

Python入门到精通(三)——Python循环语句

Python循环语句 一、while 循环 1、基础语法 2、嵌套应用 二、for 循环 1、基础语法 2、嵌套应用 三、循环中断&#xff1a;break 和 continue 1、break 2、continue 四、综合案例 一、while 循环 1、基础语法 while的条件需得到布尔类型&#xff0c;True表示继续循环…

一款真正可用的支付系统,可搭建自己的易支付系统,开源无后门

应用介绍 介绍: thinkphp开发的风吹雪支付系统易支付去后台验证版本&#xff0c;支持代理系统&#xff0c;适合搭建易支付系统&#xff0c;完整100%可运行网站源码。是为数不多的一款真正可用的支付系统&#xff0c;开源无后门可运营。 自带微信支付宝官方通道&#xff0c;资质…

探秘网络爬虫的基本原理与实例应用

1. 基本原理 网络爬虫是一种用于自动化获取互联网信息的程序&#xff0c;其基本原理包括URL获取、HTTP请求、HTML解析、数据提取和数据存储等步骤。 URL获取&#xff1a; 确定需要访问的目标网页&#xff0c;通过人工指定、站点地图或之前的抓取结果获取URL。 HTTP请求&#…

一键拆分,轻松整理,高效管理文本文件,让工作更轻松!

在日常工作中&#xff0c;我们经常需要处理大量的文本文件。如何快速整理这些文件&#xff0c;方便管理和使用成为了关键问题。为此&#xff0c;我们为您推荐一款强大的一键拆分和整理工具&#xff0c;助您高效管理文本文件&#xff01; 首先&#xff0c;在首助编辑高手的主页面…

Gradle——基础

1、Gradle基础 1.1、Ant/Maven/Gradle对比 无论那种项目构建工具&#xff0c;都有自身的优势和劣势&#xff0c;所以选择一款最适合项目的就是最好的&#xff01; 1.2、Gradle项目目录结构 Gradle项目默认目录结构和Maven项目的目录结构一致&#xff0c;都是基于约定大于配置…

好物周刊#37:元气桌面

https://github.com/cunyu1943/JavaPark https://yuque.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. MallChat 一个既能购物又能聊天的电商系统。以互联网企业级开发规范的…

《斗罗大陆Ⅱ绝世唐门》美女盘点:高颜值角色吸睛无数,玄机科技再塑国漫辉煌

在国漫崛起的大潮中&#xff0c;玄机科技以其精湛的建模技术和独特的审美视角&#xff0c;打造了一部又一部备受瞩目的佳作。其中&#xff0c;《绝世唐门》作为玄幻类动画的代表&#xff0c;凭借其丰富的人物设定和颜值爆表的角色&#xff0c;赢得了无数观众的喜爱和追捧。今天…

DC-3靶机刷题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1-P5ezyt5hUbmmGMP4EI7kw?pwdrt2c 提取码&#xff1a;rt2c 参考&#xff1a; http://t.csdnimg.cn/hhPi8https://www.vulnhub.com/entry/dc-32,312/ 官网http://t.csdnimg.cn/5mVZ7DC-3 (1).pdfhttps://…

裸辞后找工作有多难?分享个人经历+面经+学习路线【内含免费下载初级前端面试题】- 回忆我的2023

&#x1f449; 个人博客主页 &#x1f448; &#x1f4dd; 一个努力学习的程序猿 专栏&#xff1a; HTML和CSS JavaScript jQuery Vue Vue3 React TypeScript uni-app Linux 前端面试分享 前端学习方案分享(VitePress、html2canvasjspdf、vuedraggable、videojs) 前端踩坑日记&…

2023年上半年网络工程师真题(2/3)

21.在OSI参考模型中&#xff0c;负责对应用层消息进行压缩&#xff0c;加密功能的层次为&#xff08;C&#xff09;。 A.传输层 B.会话层 C.表示层 D.应用层 表示层。表示层处理的是用户信息的表示问题。端用户(应用进程)之间传送的数据包含语义和语法两个方面。语义是数据…

索引的概述和性能分析

索引index&#xff0c;是一种有序的数据结构&#xff0c;可以高效的获取数据&#xff0c;在数据库中维护着满足查找特定算法的数据结构&#xff0c;就是索引 无索引的情况&#xff0c;查询数据时会全表扫描&#xff0c;效率极低 索引结构 &#xff08;1&#xff09;二叉树&…

flink学习之水位线

什么是水位线 在事件时间语义下&#xff0c;我们不依赖系统时间&#xff0c;而是基于数据自带的时间戳去定义了一个时钟&#xff0c; 用来表示当前时间的进展。于是每个并行子任务都会有一个自己的逻辑时钟&#xff0c;它的前进是靠数 据的时间戳来驱动的。 我们可以把时钟也以…

Linux下MySQL用户管理、权限、密码

一、原理 MySQL的用户管理实质上是对用户表的管理&#xff0c;系统中的数据库mysql存在一张用户表&#xff08;user&#xff09;&#xff0c;所有的用户都在该表内&#xff0c;对用户的管里也就是对该表进行增删查改的操作。 show databases; 如图中的mysql数据库&#xff0c;…

Leetcode 用队列实现栈

题目&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int pop() 移除并…

2024/1/20 并查集

目录 并查集关键代码 亲戚 村村通 团伙&#xff08;新知识&#xff09; 并查集关键代码 返回祖宗节点路径压缩&#xff1a; int find(int x) {if(f[x]!x) f[x]find(f[x]);return f[x]; } 合并&#xff1a; void make(int x,int y) {int f1find(f[x]);int f2find(f[y]);…