1. 背包(Bag)
1.1 介绍
背包是一种容器,用于存储一组元素,它不保持元素的任何特定顺序,只支持添加元素和判断背包是否为空。背包通常用于收集和临时存储数据,可以根据需要动态添加元素。
1.2 C#实现
在C#中,可以使用List
class Bag<T>
{
private List<T> items = new List<T>();
public void Add(T item)
{
items.Add(item);
}
public bool IsEmpty()
{
return items.Count == 0;
}
}
在上面的代码中,我们使用List
1.3 示例
下面是一个使用背包的示例,用于存储一组整数:
Bag<int> bag = new Bag<int>();
bag.Add(1);
bag.Add(2);
bag.Add(3);
Console.WriteLine("Is empty? " + bag.IsEmpty());
运行上面的代码,输出结果为:
Is empty? False
可以看到,背包不为空。
2. 队列(Queue)
2.1 介绍
队列是一种先进先出(FIFO)的数据结构,它以类似于排队的方式管理数据。只允许在一端插入数据(入队),在另一端删除数据(出队)。队列常用于处理顺序相关的问题,如任务调度、消息传递等。
2.2 C#实现
在C#中,可以使用Queue
class Queue<T>
{
private LinkedList<T> items = new LinkedList<T>();
public void Enqueue(T item)
{
items.AddLast(item);
}
public T Dequeue()
{
if (IsEmpty())
{
throw new InvalidOperationException("Queue is empty.");
}
T item = items.First.Value;
items.RemoveFirst();
return item;
}
public bool IsEmpty()
{
return items.Count == 0;
}
}
在上面的代码中,我们使用LinkedList
2.3 示例
下面是一个使用队列的示例,模拟了一组任务的执行顺序:
Queue<string> queue = new Queue<string>();
queue.Enqueue("Task 1");
queue.Enqueue("Task 2");
queue.Enqueue("Task 3");
while (!queue.IsEmpty())
{
string task = queue.Dequeue();
Console.WriteLine("Executing task: " + task);
}
运行上面的代码,输出结果为:
Executing task: Task 1
Executing task: Task 2
Executing task: Task 3
可以看到,任务按照入队的顺序依次执行。
3. 栈(Stack)
3.1 介绍
栈是一种后进先出(LIFO)的数据结构,它以类似于弹夹的方式管理数据。只允许从一端插入和删除数据,这一端称为栈顶。栈常用于处理逆序相关的问题,如表达式求值、函数调用等。
3.2 C#实现
在C#中,可以使用Stack
class Stack<T>
{
private LinkedList<T> items = new LinkedList<T>();
public void Push(T item)
{
items.AddLast(item);
}
public T Pop()
{
if (IsEmpty())
{
throw new InvalidOperationException("Stack is empty.");
}
T item = items.Last.Value;
items.RemoveLast();
return item;
}
public bool IsEmpty()
{
return items.Count == 0;
}
}
在上面的代码中,我们使用LinkedList
3.3 示例
下面是一个使用栈的示例,将一个字符串反转输出:
Stack<char> stack = new Stack<char>();
string input = "Hello";
foreach (char c in input)
{
stack.Push(c);
}
while (!stack.IsEmpty())
{
Console.Write(stack.Pop());
}
运行上面的代码,输出结果为:
olleH
可以看到,字符串被反转输出。