一、队列
什么是队列?
队列是一种特殊的线性结构,也是一种表,使用队列时插入在一端而删除在另一端进行。
队列在生活中的场景很多,比如火车队买票,每个排队的窗口就是一个队列,先来的人站在前面,先买到票,后来的人排在后面,队列是先进先出(FIFO)原则。
队列的基本模型:
入队:在表的末端插入一个元素
出队:删除(并返回)在表的开头的元素
问题:给定一列数,使用队列输出。
import java.util.Scanner;
public class Duilie {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //读入个数n
int[] q = new int[n+1]; //创建数组实现队列
int head = 0, tail = 0; //定义队首和队尾,初始队列为空时,队首和队尾指向第一个下标
while(tail < n){
q[tail] = sc.nextInt();
tail++; //每读进一个数,队尾往后移一位
}
while(head < tail){ //打印队列
System.out.print(q[head]+" ");
head++;
}
sc.close();
}
}
二、栈
什么是栈呢?
栈是限制插入和删除只能在同一位置上进行的表,该位置是表的末端(栈也是一种表),叫做栈顶,对栈的基本操作有进栈和出栈。前者是相当于插入,后者是删除最后插入的元素。栈是后进先出的数据结构,举个例子,薯片,你最先抽出的是最后放进去的一片,如果你想吃到最里面那片,那么你只能先把外面的全部吃完。
问题:
使用栈实现判断回文串。
import java.util.Scanner;
public class ZhanShixianHuiwenshu {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int len,mid,next,top;
String str = sc.nextLine();//读入子浮串
char[] c = str.toCharArray(); //将字符串转换为数组
len = c.length;
char[] s = new char[len+1];
mid = len/2-1; //取中电
top = 0;
for(int i=0; i<=mid; i++){ //将mid前的字符重新依次入栈
s[++top] = c[i];
}
if(len%2==0) //判断字符串的长度是奇数或者偶数,
next=mid+1;//找到需要匹配字符串的起始下标
else
next=mid+2;
for(int i=next;i<=len-1; i++){//开始匹配
if(c[i] != s[top]){
break;
}
top--;
}
if(top==0)
System.out.println("YES");
else
System.out.println("No");
sc.close();
}
}
三、链表
使用数组存储数字比较方便,但是对于一些增删操作会比较麻烦,比如如果你向已经排好序的数组中插入一个数,那么你需要先把这个数放到数组中,然后将原本该数后面的所有数往后移一位。而使用链表会快很多。
那么,什么是链表呢?
链表由一系列节点组成,这些节点不必在内存中相连,每一个节点均含有表元素和到包含该元素后继几点的链(link),我们称之为next链,最后一个单元的next链引用null。链表有单项链表和双向链表(这里不细说,给出单项链表是数组实现)
C语言中可以使用指针实现链表,下面给出利用数组模拟实现链表。
import java.util.Scanner;
public class LianBiao {
public static void main(String[] args) {
int data[] = new int[12]; //存储数据的数组
int right[] = new int[12]; //存的是每个data[i]右边位置的下标
int n,len,t;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();//个数n
for(int i=1;i <= n; i++){//将n个数读入到数组data中
data[i] = sc.nextInt();
}
len = n;
for(int i=1; i<= n; i++){//数组的初始化,前n-1个数的右边位置下标等于数组下标加一
if(i!=n){ //标等于数组下标加一
right[i] = i+1;
}
else{ //最后一个数的右边没人了,存储为0
right[i] =0;
}
}
len++;
data[len]=sc.nextInt();//将要插入的数读到data数组的最后一位
t=1;
while(t!=0){
if(data[right[t]]>data[len]){//判断这个数应该在哪个位置,本列中假设这组数是
right[len] = right[t]; //由小到达排,即当某一个数的右边数比待插入数大时
right[t] =len; //把待插入数放在这个数的左边,更新坐标
break;
}
t = right[t];//更新t,从左往右遍历数组
}
t=1;
while(t!=0){
System.out.print(data[t]+" ");
t = right[t];
}
sc.close();
}
}