数组模拟单链表
//数组模拟单链表
static int N=100010;
static int head=-1;static int[] e=new int[N];static int[] ne=new int[N];
static int idx=0;
//初始化
public static void init(){
head=-1;
idx=0;
}
//通过头插法添加节点
public static void add(int x){
e[idx]=x;
ne[idx]=head;
head=idx++;
}
//在第k个位置插入节点
public static void add_k(int k,int x){
e[idx]=x;//对应的删除第k+1个节点
ne[idx]=ne[k];
ne[k]=idx++;//其实就是将头插法head变为ne[k];
}
//删除第k个节点
public static void remove(int k){
ne[k]=ne[ne[k]];
}
通过数组模拟双向链表
import java.util.Scanner;
public class Main {
static int N=100010;
static int[] e=new int[N];static int[] left=new int[N];
static int[] right=new int[N];static int idx=0;
public static void main(String[] args) {
//通过数组模拟双链表
init();
Scanner sc=new Scanner(System.in);
int n=Integer.parseInt(sc.nextLine());
for(int i=0;i<n;i++){
String s=sc.nextLine();
String[] ss = s.split(" ");
if(ss[0].equals("L")){
//最左端插入一个数
int x=Integer.parseInt(ss[1]);
add_k_right(0,x);
}else if(ss[0].equals("R")){
//最右端插入一个数
int x=Integer.parseInt(ss[1]);
add_k_right(left[1],x);
}else if(ss[0].equals("D")){
int k=Integer.parseInt(ss[1]);
remove(k+1);
}else if(ss[0].equals("IL")){
int k=Integer.parseInt(ss[1]);
int x=Integer.parseInt(ss[2]);
add_k_right(left[k+1],x);
}else if(ss[0].equals("IR")){
int k=Integer.parseInt(ss[1]);
int x=Integer.parseInt(ss[2]);
add_k_right(k+1,x);
}
}
for(int i=right[0];i!=1;i=right[i]){
System.out.print(e[i]+" ");
}
}
public static void init(){
//0表示左端点 1表示右端点
right[0]=1;left[1]=0;
idx=2;
}
public static void add_k_right(int k,int x){
//对于在k的左边插入元素 add_k_right(left[k],x);
e[idx]=x;
right[idx]=right[k];
left[idx]=k;
left[right[k]]=idx;
right[k]=idx;
idx++;
}
public static void remove(int k){
right[left[k]]=right[k];
left[right[k]]=left[k];
}
}
Scanner同时读取数字和字符串 空格问题
解决方式:
+ 所有的都通过nextLine()读取字符串,将数字Integer.parseInt()单独解析
+ 创建不同的Scanner对象分别读取数字和字符串
+ 通过缓冲字符流读取 BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
+ reader.readLine()
+
通过数组模拟栈
int N=100010;
int[] stk=new int[N];int tt=0;
添加元素
stk[++tt]=x;
删除元素
tt–;
判断是否为空
return tt<=0; empty()
通过数组模拟队列
int N=100010;
int[] queue=new int[N];int tt=-1;int hh=0;对头队尾
//添加元素
queue[++tt]=x;
删除队头元素
hh++;
判断是否empty return tt>=hh; 当tt==hh 此时队列只有一个元素
import java.util.Scanner;
public class Test19 {
static int N=100010;
static int[] queue=new int[N];
static int hh=0,tt=-1;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=Integer.parseInt(sc.nextLine());
for(int i=0;i<n;i++){
String s=sc.nextLine();
String[] ss = s.split(" ");
if(ss[0].equals("push")){
int x=Integer.parseInt(ss[1]);
push(x);
}else if(ss[0].equals("pop")){
pop();
}else if(ss[0].equals("empty")){
System.out.println(empty()? "YES":"NO");
}else if(ss[0].equals("query")){
System.out.println(query());
}
}
}
public static void push(int x){
queue[++tt]=x;
}
public static int pop(){
return queue[hh++];
}
public static boolean empty(){
return hh>tt;
}
public static int query(){
return queue[hh];
}
}