文章目录
一、数据结构简介
数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合,往往同高效的检索算法和索引技术有关。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储(物理)结构。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
1、逻辑结构
指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后间关系,而与他们在计算机中的存储位置无关。一般分为线性和非线性两大类,或者以下四类:
- 集合结构:数据元素之间除了“属于同一个集合”的关系之外没有其他关系。
- 线性结构:数据元素的有序集合。数据元素之间形成一对一的关系。
- 树型结构:树是层次数据结构,树中数据元素之间存在一对多的关系。
- 图状结构:图中数据元素之间的关系是多对多的。
2、存储(物理)结构
指数据的逻辑结构在计算机存储空间中的存放形式。一般来说,一种数据结构的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序存储、链式存储、索引存储和哈希存储等。
-
顺序存储结构是指用一组连续的存储单元一次存储数据元素,数据元素之间的逻辑关系是有元素的存储位置来(隐式)表示的。
-
链式存储结构是指用一组任意的存储单元来存储数据元素,数据元素之间的逻辑关系借助于指示元素存储地址的执指针来(显示)表示。
3、常见的数据结构
常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表(哈希表)等。
二、栈(stack)
栈是一种特殊的线性表(0个或以上相同类型的数据元素构成的有限序列),仅能在线性表的一端操作,允许操作的一端叫栈顶,不允许的叫栈底。 栈的特点是:先进后出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
以java为例,要实现的栈的API如下:
public class Stack< Item> implements Iterable< Item>
Stack() —————————— 创建一个空栈
void push(Item item) ———— 添加一个元素
Item pop() —————————删除最近添加的元素
boolean isEmpty() ————— 栈是否为空
int size() ————————— 栈中的元素数量
1、 用数组实现栈
public class ArrayStack <Item>{
// 栈元素的总数
private int N = 0;
// 存放栈元素的数组
private Item [] items;
public ArrayStack (int M) {
items = (Item[]) new Object[M];
}
/**
* @description: 向栈顶插入元素
*/
public void push (Item item) {
if (N<=items.length)
items[N++] = item;
else System.out.println("栈已满");
}
/**
* @description: 从栈顶删除元素,并将删除的元素返回
*/
public Item pop () {
// 当栈还是空的时候, 不删除并且返回空
if(isEmpty()) return null;
// 保存将要被删除的元素
Item i = items[N-1];
// 将该元素删除
items[N-1] = null;
// 栈的长度减1
N--;
return i;
}
/**
* @description: 判断栈是否为空
*/
public boolean isEmpty () {
return N == 0;
}
/**
* @description: 返回栈的大小
*/
public int size () {
return N;
}
public static void main (String args []) {
// 开始时指定栈的容量为2
ArrayStack<Integer> stack = new ArrayStack(5);
//ArrayStack<Integer> stack2 = new ArrayStack(5);
// 向栈顶依次添加4个元素
for(int i=1;i<5;i++)
stack