数据结构—队列、栈、链表的理解
队列
队列是一种特殊的线性结构,只允许队列首部(head)进行删除操作,称为“出队”,队列尾部(tail)进行插入操作,称为“入队”,称为“先进先出”原则。
public class Queue {
public static void main(String[] args) {
int[] vessel = new int[100];
int[] queue = { 6, 3, 1, 7, 5, 8, 9, 2, 4 };
for (int i = 0; i < queue.length; i++) {
vessel[i] = queue[i];
}
int head = 0;
int tail = queue.length;
while (head < tail) {
// 打印队首先将队首出队
System.out.println(vessel[head]);
head++;
// 先将新队首的数添加到队尾
vessel[tail] = vessel[head];
tail++;
// 再将队首出队
head++;
}
}
}
栈
栈是一种后进先出的数据结构,可以用数组也可以用链表实现。
public class Inn {
public static void main(String[] args) {
char[] a = new char[101];
char[] s = new char[101];
int next;
// 读入一行字符串
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
sc.close();
a = str.toCharArray();
// 求字符串的长度
int len = a.length;
// 求字符串的中点
int mid = len / 2;
// 栈的初始化
int top = 0;
// 将mid前的字符依次入栈
for (int i = 0; i < mid; i++) {
s[++top] = a[i];
}
// 判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
if (len / 2 == 0) {
next = mid;
} else {
next = mid + 1;
}
// 开始匹配
for (int i = next; i < len; i++) {
if (a[i] != s[top]) {
break;
}
top--;
}
// 如果top的值为0,则说明栈内所有的字符都能
if (top == 0) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
链表
链表是一种线性表(有n个元素组成的有限序列),链表是一种基础的数据结构,通常有一连串的节点组成。节点中存放数据和指向下一节点的指针。因为链表不是按线性的顺序存储结构,其查询某节点的时间是,插入操作。链表分为单链表,双链表和循环链表。
public class Linked {
public static void main(String[] args) {
int[] data = new int[101];
int[] right = new int[101];
// 读入已有的数
Scanner sc = new Scanner(System.in);
System.out.println("请输入数字个数:");
int n = sc.nextInt();
for (int i = 1; i <= n; i++) {
System.out.println("第" + i + "个:");
data[i] = sc.nextInt();
}
int len = n;
// 初始化数组right
for (int i = 1; i <= n; i++) {
if (i != n) {
right[i] = i + 1;
} else {
right[i] = 0;
}
}
// 直接在数组data的末尾增加一个数
len++;
System.out.println("插入数字:");
data[len] = sc.nextInt();
// 从链表的头部开始遍历
int t = 1;
while (t != 0) {
// 如果当前结点下一个结点的值大于待插入数,将数插入到中间
if (data[right[t]] > data[len]) {
// 新插入数的下一个结点符号等于当前结点的下一个结点编号
right[len] = right[t];
// 当前结点的下一个结点编号就是新插入数的编号
right[t] = len;
break;
}
t = right[t];
}
// 输出链表中所有的数
t = 1;
while (t != 0) {
System.out.println(data[t]);
t = right[t];
}
sc.close();
}
}