一、数组
- 特点:
元素在内存中是连续存储,元素通过数组下标访问。
- 优点:
随机访问效率高,通过索引直接访问。
- 缺点:
数组初始化后大小固定,无法扩容。
只能存储一种类型数据。
添加和删除效率低,因为需要移动其他元素。
- 适用场景:
频繁查询,对空间要求不大,添加和删除操作少。
二、链表
- 特点:
非连续存储空间、非顺序存储的数据结构。数据元素的逻辑顺序是通过链表的指针地址实现,每个元素包含两个结点,一个是存储元素的数据域 (内存空间),另一个是指向下一个结点地址的指针域。
- 优点:
添加和删除效率高。
无需初始化容量,可任意增减元素。
- 缺点:
含有大量指针域,占用空间大。
随机访问效率低,需遍历链表查询。
- 适用场景:
数据量较小,需要频繁添加和删除。
三、栈
- 特点:
栈是一种特殊的线性表,仅能在线性表的栈顶操作。先进后出。
-
栈的实现:
class Stack<T>
{
Node<T> top; //栈顶元素
//入栈
public void Push(T data)
{
//根据当前栈顶元素新构建一个新的栈顶,并将当前栈顶的next指向原来的top
top = new Node<T>(top, data);
}
//出栈
public T Pop()
{
if (top == null)
throw new InvalidOperationException();
T remove= top.data;
top = top.next; //重新指定栈顶
return remove;
}
}
//节点
class Node<T>
{
public Node<T> next;
public T data;
public Node(Node<T> sNext, T sData)
{
this.next = sNext;
this.data = sData;
}
}
四、队列
- 特点:
队列也是一种线性表,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。
- 队列实现
class Queue<T>
{
QueueNode<T> head; //队头
QueueNode<T> tail; //队尾
//入队
public void Push(T data)
{
QueueNode<T> node = new QueueNode<T>(data);
if (head == null && tail == null)
{
head = node;
tail = node;
}
else
{
tail.next = node;
tail = node;
}
}
//出队
public T Pop()
{
if (head == null)
throw new InvalidOperationException();
T remove= head.data;
head = head.next;
return remove;
}
}
//节点
class QueueNode<T>
{
public QueueNode<T> next;
public T data;
public QueueNode(T sData)
{
this.data = sData;
}
}