import java.util.*; public class Main { public static List<String> split(String input_str) { //空格分割 List<String> v = new ArrayList<>(); while (input_str.indexOf(" ") != -1) { int found = input_str.indexOf(" "); v.add(input_str.substring(0, found)); input_str = input_str.substring(found + 1); } v.add(input_str); return v; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input_number_str = scanner.nextLine(); int number = Integer.parseInt(input_number_str);//数据的范围 List<List<String>> operations = new ArrayList<>();//添加和删除语句 for (int i = 0; i < 2 * number; i++) { String input_str = scanner.nextLine(); operations.add(split(input_str)); } int queue_size = 0;//队列长度 boolean in_order = true;//是否按顺序删除 int result = 0;//最小的调整顺序次数 for (int i = 0; i < operations.size(); i++) { List<String> operation = operations.get(i); if (operation.get(0).equals("head")) {//从头部添加元素 if (queue_size > 0 && in_order) {//不按顺序删除 in_order = false; } queue_size++; } else if (operation.get(0).equals("tail")) {//从尾部添加元素 queue_size++; } else {//删除元素 if (queue_size == 0) { continue; } if (!in_order) {//不按顺序删除 result++; in_order = true; } queue_size--; } } System.out.println(result);//输出最小的调整顺序次数 } },每行都注释下
时间: 2024-01-23 18:01:52 浏览: 127
这段代码实现了一个关于队列操作的问题,接下来我将逐行解释代码的含义:
```java
import java.util.*;
public class Main {
// 定义函数 split,将字符串按照空格分割成多个字符串,并返回一个 List
public static List<String> split(String input_str) {
List<String> v = new ArrayList<>();
while (input_str.indexOf(" ") != -1) {
int found = input_str.indexOf(" ");
v.add(input_str.substring(0, found));
input_str = input_str.substring(found + 1);
}
v.add(input_str);
return v;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input_number_str = scanner.nextLine();
int number = Integer.parseInt(input_number_str); // 获取数据的范围
List<List<String>> operations = new ArrayList<>(); // 定义二维 List,用于存储添加和删除的操作
// 循环读取输入的操作,将每个操作按照空格分割成多个字符串,然后添加到 operations 中
for (int i = 0; i < 2 * number; i++) {
String input_str = scanner.nextLine();
operations.add(split(input_str));
}
int queue_size = 0; // 定义队列长度
boolean in_order = true; // 定义是否按顺序删除
int result = 0; // 定义最小的调整顺序次数
// 循环遍历 operations 中的操作
for (int i = 0; i < operations.size(); i++) {
List<String> operation = operations.get(i); // 获取当前操作
if (operation.get(0).equals("head")) { // 如果是从头部添加元素
if (queue_size > 0 && in_order) { // 如果队列长度大于 0,且之前是按顺序删除的,则将 in_order 置为 false
in_order = false;
}
queue_size++; // 队列长度加 1
} else if (operation.get(0).equals("tail")) { // 如果是从尾部添加元素
queue_size++; // 队列长度加 1
} else { // 如果是删除元素
if (queue_size == 0) { // 如果队列长度为 0,则忽略该操作
continue;
}
if (!in_order) { // 如果之前不是按顺序删除的,则将 result 加 1,然后将 in_order 置为 true
result++;
in_order = true;
}
queue_size--; // 队列长度减 1
}
}
System.out.println(result); // 输出最小的调整顺序次数
}
}
```
总的来说,这个问题是要求实现一个队列,支持从头和尾部添加元素以及删除元素,并计算最小的调整顺序次数,使得删除元素时按顺序删除。其中,添加元素的操作是不需要考虑顺序的,只有删除元素时才需要按照之前添加的顺序进行删除。
阅读全文