2025-11-07
C#
00

在C#中,栈(Stack)和队列(Queue)是两种常用的数据结构,它们在软件开发中有着广泛的应用场景。本文将详细介绍栈和队列的定义、特点以及在实际开发中的应用实例。

栈(Stack)

栈是一种后进先出(LIFO, Last-In-First-Out)的数据结构,它只允许在一端(栈顶)进行添加(push)和移除(pop)操作。

应用场景

1. 函数调用栈

当程序执行一个函数调用时,函数的局部变量和返回地址被推入系统的调用栈中。当函数执行完毕后,返回地址和局部变量会按照LIFO的顺序被弹出,以确保程序能够返回到正确的位置继续执行。

2. 撤销操作(Undo)

在文本编辑器或图形编辑软件中,栈可以用来实现撤销操作。每次用户执行一个操作,该操作的逆操作被推入栈中。当用户选择撤销时,栈顶的逆操作被执行。

3. 浏览器历史

浏览器可以使用栈来管理访问过的页面历史。新访问的页面被推入栈中,当用户点击后退按钮时,栈顶的页面被弹出并显示。

4. 语法分析

编译器在解析程序代码时,会使用栈来处理嵌套的语法结构,如括号匹配和XML标签匹配。

示例:括号匹配检查

C#
using System; using System.Collections.Generic; // 定义一个类来检查给定字符串中的括号是否平衡 public class ParenthesesChecker { // 静态方法,用于检查输入字符串中的括号是否平衡 public static bool AreParenthesesBalanced(string input) { // 使用栈来存储遇到的开括号 Stack<char> stack = new Stack<char>(); // 遍历输入字符串中的每个字符 foreach (char ch in input) { // 根据当前字符的类型采取不同的操作 switch (ch) { // 如果是开括号,将其压入栈中 case '(': case '{': case '[': stack.Push(ch); break; // 如果是闭括号,检查栈顶的开括号是否匹配 case ')': // 如果栈为空或栈顶的开括号不匹配,则括号不平衡 if (stack.Count == 0 || stack.Pop() != '(') return false; break; case '}': // 如果栈为空或栈顶的开括号不匹配,则括号不平衡 if (stack.Count == 0 || stack.Pop() != '{') return false; break; case ']': // 如果栈为空或栈顶的开括号不匹配,则括号不平衡 if (stack.Count == 0 || stack.Pop() != '[') return false; break; } } // 如果遍历完字符串后栈为空,则所有的开括号都找到了匹配的闭括号,括号平衡 // 否则,表示有未匹配的开括号,括号不平衡 return stack.Count == 0; } } class Program { static void Main() { string expression = "{[()]}"; Console.WriteLine($"Is the expression balanced? {ParenthesesChecker.AreParenthesesBalanced(expression)}"); } }

image.png

2025-11-07
C#
00

循环队列是一种特殊的队列数据结构,它允许队列的尾部连接到头部形成一个圆环。这种结构的好处是当队列满时,可以从头部开始重用空间,这样就不需要在每次队列满时进行数据迁移。

在C#中,没有内置的循环队列类,但我们可以通过数组来实现一个循环队列。以下是C#中循环队列实现的详细说明和示例。

循环队列的实现

循环队列通常使用一个固定大小的数组和两个指针(front和rear)来实现。front指针指向队列的第一个元素,而rear指针指向队列的最后一个元素的下一个位置。

定义循环队列类

首先,我们定义一个循环队列类,并声明所需的变量。

C#
public class CircularQueue<T> { private T[] _queue; private int _front; private int _rear; private int _count; public CircularQueue(int size) { _queue = new T[size + 1]; // 分配额外空间用于判断队列是否满 _front = 0; _rear = 0; _count = 0; } // 添加其他方法... }
2025-11-07
C#
00

队列的基本概念

队列(Queue)是一种先进先出(First In First Out,FIFO)的数据结构,它允许在一端(通常称为队尾或rear)添加元素,在另一端(队头或front)移除元素。队列的这种特性使其在需要按顺序处理数据的场景中非常有用。

队列的基本操作

队列的基本操作包括:

  • Enqueue:在队列的末尾添加一个元素。
  • Dequeue:移除并返回队列的第一个元素。
  • Peek:返回队列的第一个元素但不移除它。
  • Count:获取队列中元素的数量。
  • Clear:清空队列中的所有元素。

队列的特点

  • 有序性:元素保持添加的顺序,先进入的元素先被移除。
  • 动态大小:队列的大小不是固定的,可以随着元素的添加和移除而改变。
  • 限制访问:只能访问队列的头部和尾部元素,不允许随机访问。

队列的应用场景

  • 任务调度:操作系统中的任务调度器使用队列管理进程执行。
  • 打印任务管理:打印机的打印任务排队等待处理。
  • 实时系统:交通信号灯、呼叫中心等实时系统中的事件排队处理。
2025-11-07
C#
00

栈(Stack)是一种后进先出(Last In First Out, LIFO)的数据结构,它只允许在一端进行插入和删除操作。这一端被称为栈顶(Top),而另一端则被称为栈底(Bottom)。在C#中,栈可以通过内置的 Stack<T> 类实现,其中 T 是栈中存储的数据类型。

栈的基本操作

栈的操作主要有以下几种:

  • Push:将一个元素添加到栈顶。
  • Pop:移除并返回栈顶元素。
  • Peek:返回栈顶元素而不移除它。
  • Count:获取栈中元素的数量。
  • Clear:清空栈中的所有元素。

栈的特点

  • 简单易用:栈是一种简单的数据结构,操作直观。
  • 有限访问:只能访问栈顶元素,不允许随机访问。
  • 动态大小:栈的大小不是固定的,可以动态增长和缩减。

栈的应用场景

  • 撤销操作:在文本编辑器中撤销操作通常使用栈来实现。
  • 函数调用:计算机程序的函数调用栈用来保存函数调用的上下文。
  • 表达式求值:计算数学表达式时,栈用于存储操作数和操作符。
2025-11-07
SQLSERVER
00

在 SQL Server 中,数据的导入和导出是数据库管理和数据交换中的常见任务。这些任务可以通过多种方式完成,包括 SQL Server Integration Services (SSIS)、BULK INSERT 语句以及 bcp 命令行工具等。

SQL Server Integration Services (SSIS)

SSIS 是一个强大的 ETL 工具,可以用来执行复杂的数据导入、导出和转换任务。以下是一个简单的 SSIS 包的创建步骤,用于将数据从一个源导入到 SQL Server 数据库中。

创建 SSIS 包

  1. 打开 SQL Server Data Tools (SSDT) 或 Visual Studio。
  2. 创建一个新的 Integration Services 项目。
  3. 在“控制流”区域添加一个“数据流任务”。
  4. 双击“数据流任务”,在“数据流”选项卡中配置数据源和目标。
  5. 选择合适的源和目标组件,例如“OLE DB 源”和“OLE DB 目标”。
  6. 映射源和目标之间的列。
  7. 保存并运行 SSIS 包以执行数据传输。

SSIS 脚本示例

由于 SSIS 包是通过图形界面来创建的,这里不提供脚本示例。但是,可以通过 SSDT 自动化和调度 SSIS 包的执行。

BULK INSERT 语句

BULK INSERT 是一个 T-SQL 命令,用于将大量数据快速导入 SQL Server 表中。以下是使用 BULK INSERT 语句的示例。

导入 CSV 文件

SQL
BULK INSERT YourDatabase.dbo.YourTable FROM 'C:\path\to\your\file.csv' WITH ( FIELDTERMINATOR = ',', -- CSV 字段分隔符 ROWTERMINATOR = '\n', -- CSV 行分隔符 FIRSTROW = 2, -- 文件中的数据开始行,这里假设第一行为标题 TABLOCK -- 使用表锁定以提高性能 )

image.png