实验18:迭代器模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解迭代器模式的动机,掌握该模式的结构;
2、能够利用迭代器模式解决实际问题。
[实验任务一]:JAVA和C++常见数据结构迭代器的使用
信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从小到大和从大到小两种次序输出学生信息。
实验要求:
1. 搜集并掌握JAVA和C++中常见的数据结构和迭代器的使用方法,例如,vector, list, map和set等;
1.
Java常用数据结构及应用:数组,栈和队列
数据结构
常用数据结构
1.数组Array
2.栈Stack
3.队列Queue
数据结构
数据结构是为了让计算机能够更合理地组织数据、更高效地存储和处理数据而产生的。计算机中的数据往往具有复杂的关系,因此存取效率,可扩展性,顺序性,可排序性都是数据结构中的重要指标。
数据结构贯穿程序设计的始终。
数据表示 数据处理
抽象 逻辑结构 基本运算
实现 存储结构 算法
评价 不同数据结构的比较及算法分析
逻辑结构: 逻辑结构就是数据之间的关系。可以分为两种:线性结构和非线性结构。
线性结构:有且只有一个开始结点和一个终端结点,且所有结点都最多只有一个直接前驱和一个直接后继。如线性表,典型的有:顺序表、链表、栈(顺序栈、链栈)和队列(顺序队列、链队列)等。
非线性结构:每个结点可以有不止一个直接前驱和直接后继。常见的非线性结构有:树、图等。
存储结构: 存储结构也就是物理结构,是逻辑结构的存储映像。常见的存储结构有顺序存储、链式存储、索引存储以及散列存储(哈希表)。可以将存储结构理解为逻辑结构在计算机中的表现形式。
基本运算: 包括数据的增删改查和排序,根据逻辑结构来定义,根据算法和存储结构来实现。
算法: 算法可以理解为解决问题的步骤。对于数据结构来说,如何插入、寻找和删除一个数据项以及如何迭代地访问某一数据结构中的各数据项等都属于算法的范畴。另一个我们熟知的范畴就是排序。
常用数据结构
数据结构可以划分为三类:线性(排序)结构,树形结构,图形结构。
Java语言中最常用的数据结构包括数组、队列、链表等等
2. 提交源代码;
Java 源代码
首先,定义一个学生类Student:
java
public class Student {
private String name;
private String id;
private int age;
public Student(String name, String id, int age) {
this.name = name;
this.id = id;
this.age = age;
}
// Getters
public String getName() {
return name;
}
public String getId() {
return id;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", id='" + id + '\'' +
", age=" + age +
'}';
}}
然后,使用ArrayList和迭代器遍历学生信息:
java
import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;
public class StudentIterator {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
// 假设students已经被填充了44名学生的信息
// 例如:
students.add(new Student("Alice", "20130001", 20));
students.add(new Student("Bob", "20130002", 21));
// ... 添加更多学生信息
// 按学号从小到大排序
Collections.sort(students, Comparator.comparing(Student::getId));
System.out.println("Students sorted by ID (ascending):");
for (Student student : students) {
System.out.println(student);
}
// 为了按学号从大到小排序,我们可以反转列表
List<Student> reversedStudents = new ArrayList<>(students);
Collections.reverse(reversedStudents);
System.out.println("Students sorted by ID (descending):");
for (Student student : reversedStudents) {
System.out.println(student);
}
}}
C++ 源代码
首先,定义一个学生类Student:
cpp
#include <iostream>#include <vector>#include <algorithm>
class Student {public:
std::string name;
std::string id;
int age;
Student(std::string name, std::string id, int age) : name(name), id(id), age(age) {}
friend bool operator<(const Student& a, const Student& b) {
return a.id < b.id;
}
friend std::ostream& operator<<(std::ostream& os, const Student& student) {
os << "Student{name: " << student.name << ", id: " << student.id << ", age: " << student.age << "}";
return os;
}};
然后,使用std::vector和迭代器遍历学生信息:
cpp
#include <iterator>#include <vector>#include <algorithm>
int main() {
std::vector<Student> students;
// 假设students已经被填充了44名学生的信息
// 例如:
students.emplace_back("Alice", "20130001", 20);
students.emplace_back("Bob", "20130002", 21);
// ... 添加更多学生信息
// 按学号从小到大排序
std::sort(students.begin(), students.end());
std::cout << "Students sorted by ID (ascending):" << std::endl;
for (const auto& student : students) {
std::cout << student << std::endl;
}
// 为了按学号从大到小排序,我们可以反转向量
std::reverse(students.begin(), students.end());
std::cout << "Students sorted by ID (descending):" << std::endl;
for (const auto& student : students) {
std::cout << student << std::endl;
}
return 0;}
在这两个示例中,我们都使用了容器(Java中的ArrayList和C++中的std::vector)来存储学生信息,并使用了迭代器(Java中的增强型for循环和C++中的基于范围的for循环)来遍历容器中的元素。对于排序,Java使用了Collections.sort()方法,而C++使用了std::sort函数。在C++示例中,我们还定义了Student类的小于运算符,以便std::sort可以按照学号排序。
3. 注意编程规范。