数据结构是相互之间存在一种或多种特定关系的数据元素的集合。其中关系是指数据元素之间的逻辑关系,即逻辑结构。
数据结构和算法是计算机科学的两大支柱,是程序设计的基础。
例如栈,只有先了解了它的结构、原理才能更好的使用它去编程
栈是限定仅在表尾进行插入或删除操作的线性表。表尾端称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈
栈的特性是先进后出(FILO),后进先出(LIFO)
我用了两种方法定义栈,数组和链式结构
数组---栈是长度可变的,而数组的长度是定长的,所以就可以运用自定义的长度可变数组来做(详细看我的上一篇)
每次数据入栈时,数据直接加到数组的尾部,数据出栈时,直接删除数组的最后一个数据
public class MyStack<E> {
private int num;//栈中数据的数量
private int rongliang;
private int zengliang;
//定义一个原数组
//用E是后面会出错,而Object类包含所有的类型,所以定义数组是用Object类
private Object[] src;
//三个不同的构造方法
public MyStack(){
this(10,10);
}
public MyStack(int rongliang){
this(rongliang,10);
}
public MyStack(int rongliang,int zengliang){
this.rongliang = rongliang;
this.zengliang = zengliang;
src = new Object[rongliang];
}
//将数据压入栈中
public void push(E e){
if(num>=src.length){
Object[] arr = new Object[src.length+zengliang];
System.arraycopy(src, 0, arr, 0, num);
src = arr;
}
src[num++] = e;
}
//查看栈顶的数据
public E get(){
return (E) src[num-1];
}
//弹出栈顶的数据
public E pop(){
System.arraycopy(src, 0, src, 0, num-1);
num--;
return (E)src[num];
}
// 判断栈是否为空
public boolean isEmpty() {
return src.length == 0;
}
//获得栈的大小
public int size(){
return num;
}
}
链式结构--栈的长度可变,链表的长度也可变
放入数据时,直接将新放入的数据作为链表的头,将原先放进去的向后移,而且删除数据时,删除链表的头部会更容易,所以入栈放数据时,倒着放进去,即将链表的头当做栈的尾端(即栈顶)
public class MyStack<E> {
// 定义一个长度是0的链表
Node top = null;
int num;// 结点个数
// 将数据压入栈中
public void push(E e) {
// 创建结点对象
Node n = new Node(e);
// 每次都将新的结点作为新的头结点
n.next = top;
top = n;
num++;
}
// 查看栈顶的数据
public E get() {
return top == null ? null : top.e;
}
// 弹出栈顶的数据
public E poll() {
if (top == null) {
return null;
}
// 如果头结点存在,就取出并移除头结点
Node n = top;
top = n.next;
n.next = null;
num--;
return n.e;
}
// 判断栈是否为空
public boolean isEmpty() {
return num == 0;
}
//获得栈的大小
public int size(){
return num;
}
// 链式结构的结点类
private class Node {
E e;
Node next;
public Node(E e) {
this.e = e;
}
}
}