顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表
顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
即:将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。
补充: 顺序表中的物理地址和逻辑地址一致。
数据结构图
顺序表的结构中数组的是按顺序存储的。
代码操作
1.定义顺序顺序表
在这里插入代码片
public class SeqList {
public int[] elem;
public int usedSize;//目前存储元素个数
//默认容量
private static final int DEFAULT_SIZE = 6;
public SeqList() {
this.elem = new int[DEFAULT_SIZE];
}
}
2.顺序表功能
public void display() { } // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
public void add(int data) { } // 新增元素,默认在数组最后新增
public void add(int pos, int data) { } // 在 pos 位置新增元素
public boolean contains(int toValue) { return true; } // 判定是否包含某个元素
public int indexOf(int toValue) { return -1; } // 查找某个元素对应的位置
public int get(int pos) { return -1; } // 获取 pos 位置的元素
public void set(int pos, int value) { } // 给 pos 位置的元素设为 value
public void remove(int toRemove) { } //删除第一次出现的关键字key
public int size() { return 0; } // 获取顺序表长度
public void clear() { } // 清空顺序表
游戏实现
三个对象,轮流抓牌,连续抓五轮。
扑克牌每中牌13张除去大小王。
poker
package demo;
public class Poker {
private String suit;//花色
private int rank;//数字
public Poker(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
public String getSuit() {
return suit;
}
public void setSuit(String suit) {
this.suit = suit;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
@Override
public String toString() {
return "{ "+suit+" "+rank+"}";
}
}
game 逻辑
package demo;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Game {
private static final String[] suits={"♠","♥","♣","♦"};
public List<Poker> buyPoker() {
List<Poker> pokers = new ArrayList<>();
for (int i = 0; i < 4; i++) {
for (int j = 1; j <= 13; j++) {
String suit = suits[i];
Poker poker = new Poker(suits[i], j);
pokers.add(poker);
}
}
return pokers;
}
public void shuffle(List<Poker> pokers) {
for (int i = pokers.size() - 1; i > 0; i--) {
Random random = new Random();
int index = random.nextInt(i);
swap(pokers,i,index);
}
}
private void swap(List<Poker> pokers, int i, int j) {
Poker tmp = pokers.get(i);
pokers.set(i, pokers.get(j));
pokers.set(j, tmp);
}
public List<List<Poker>> game (List<Poker> pokers) {
List<List<Poker>> hand = new ArrayList<>();
List<Poker> hand1 = new ArrayList<>();
List<Poker> hand2 = new ArrayList<>();
List<Poker> hand3 = new ArrayList<>();
hand.add(hand1);
hand.add(hand2);
hand.add(hand3);
//最外层循环 控制 轮数
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
Poker removePoker = pokers.remove(0);
hand.get(j).add(removePoker);
}
}
return hand;
}
}
测试类
package demo;
import java.util.List;
public class Test {
public static void main(String[] args) {
Game game=new Game();
List<Poker> pokers=game.buyPoker();
System.out.println(pokers);
//洗牌
game.shuffle(pokers);
//
System.out.println("洗牌:");
System.out.println(pokers);
//揭牌
List<List<Poker>> hand=game.game(pokers);
System.out.println("揭牌: ");
for(int i=0;i<hand.size();i++){
System.out.println("第 " + (i + 1) + "个人的牌:" + hand.get(i));
}
System.out.println("剩下的牌:");
System.out.println(pokers);
}
}
运行结果
总结:由于现实中摸完一张牌后下面一张牌(第二张牌)会成为第一张牌,因此很适合用顺序表的结构去用下个数组补掉上一个数组。