三、 线性表

线性表是最基本、最简单、也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的有限序列。

前驱元素:

若A元素在B元素的前面,则称A为B的前驱元素

后继元素:

若B元素在A元素的后面,则称B为A的后继元素

**线性表的特征:**数据元素之间具有一种“一对一”的逻辑关系。

  1. 第一个数据元素没有前驱,这个数据元素被称为头结点;

  2. 最后一个数据元素没有后继,这个数据元素被称为尾结点;

  3. 除了第一个和最后一个数据元素外,其他数据元素有且仅有一个前驱和一个后继。

如果把线性表用数学语言来定义,则可以表示为(a1,…ai-1,ai,ai+1,…an),ai-1领先于ai,ai领先于ai+1,称ai-1是ai的

前驱元素,ai+1是ai的后继元素

image-20220125191024249

线性表的分类:

线性表中数据存储的方式可以是顺序存储,也可以是链式存储,按照数据的存储方式不同,可以把线性表分为顺序

表和链表。

1.1 顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元,依次存

储线性表中的各个元素、使得线性表中再逻辑结构上响铃的数据元素存储在相邻的物理存储单元中,即通过数据元

素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。

image-20220125191050364

1.1.1 顺序表的实现

image-20220125191114355

顺序表的代码实现:

public class SequenceList<T> implements Iterable {// 存储元素的数组private T[] eles;// 当前线性表的长度private int N;/*创建容量为capacity的SequenceList对象*/public SequenceList(int capacity) {// 初始化数组this.eles = (T[]) new Object[capacity];// 初始化长度this.N = 0;}/*空置线性表*/public void clear() {this.N = 0;}/*判断线性表是否为空,是返回true,否返回false*/public boolean isEmpty() {return N == 0;}/*线性表的长度*/public int length() {return N;}/*读取并返回线性表中的第i个元素的值*/public T get(int i) {return eles[i];}/*向线性表中添加一个元素t*/public void insert(T t) {if (N == eles.length) {resize(2 * eles.length);}eles[N++] = t;}/*在线性表的第i个元素之前插入一个值为t的数据元素。*/public void insertBefore(int i, T t) {if (N == eles.length) {resize(2 * eles.length);}// 先把索引的元素及其后面的元素依向后移动一位for (int index = N; index > i; index--) {eles[index] = eles[index - 1];}// 再把t元素放到i索引处即可eles[i] = t;// 元素个数加1N++;}/*删除并返回线性表中第i个数据元素。*/public T remove(int i) {// 记录索引i处的值T current = eles[i];// 索引i后面元素依次向前移动一位for (int index = i; index < N - 1; index++) {eles[index] = eles[index + 1];}N--;if (N < eles.length / 4) {resize(eles.length / 2);}return current;}/*返回线性表中首次出现的指定的数据元素的位序号,若不存在,则返回-1。*/public int indexOf(T t) {for (int i = 0; i < N; i++) {if (eles[i].equals(t)) {return i;}}return -1;}// 根据参数newSize,重置eles的大小public void resize(int newSize) {// 定义一个临时数组,指向原数组T[] temp = eles;// 创建新数组eles = (T[]) new Object[newSize];// 把原数组的数据拷贝到新数组即可for (int i = 0; i < N; i++) {eles[i] = temp[i];}}public Iterator<T> iterator() {return new SIterator();}private class SIterator implements Iterator {private int cusor;public SIterator() {this.cusor = 0;}public boolean hasNext() {return cusor < N;}public Object next() {return eles[cusor++];}public void remove() {}}
}

1.1.2 顺序表的遍历

一般作为容器存储数据,都需要向外部提供遍历的方式,因此我们需要给顺序表提供遍历方式。

在java中,遍历集合的方式一般都是用的是foreach循环,如果想让我们的SequenceList也能支持foreach循环,

则需要做如下操作:

  1. 让SequenceList实现Iterable接口,重写iterator方法;

  2. 在SequenceList内部提供一个内部类SIterator,实现Iterator接口,重写hasNext方法和next方法;

代码参考上面的

1.1.3 顺序表的容量可变

在之前的实现中,当我们使用SequenceList时,先new SequenceList(5)创建一个对象,创建对象时就需要指定容

器的大小,初始化指定大小的数组来存储元素,当我们插入元素时,如果已经插入了5个元素,还要继续插入数

据,则会报错,就不能插入了。这种设计不符合容器的设计理念,因此我们在设计顺序表时,应该考虑它的容量的

伸缩性。

考虑容器的容量伸缩性,其实就是改变存储数据元素的数组的大小,那我们需要考虑什么时候需要改变数组的大

小?

  1. 添加元素时:

添加元素时,应该检查当前数组的大小是否能容纳新的元素,如果不能容纳,则需要创建新的容量更大的数组,我

们这里创建一个是原数组两倍容量的新数组存储元素。

image-20220125191507012

  1. 移除元素时:

移除元素时,应该检查当前数组的大小是否太大,比如正在用100个容量的数组存储10个元素,这样就会造成内存

空间的浪费,应该创建一个容量更小的数组存储元素。如果我们发现数据元素的数量不足数组容量的1/4,则创建

一个是原数组容量的1/2的新数组存储元素。

image-20220125191520850

1.1.4 顺序表的时间复杂度

get(i):不难看出,不论数据元素量N有多大,只需要一次eles[i]就可以获取到对应的元素,所以时间复杂度为O(1);

insert(int i,T t):每一次插入,都需要把i位置后面的元素移动一次,随着元素数量N的增大,移动的元素也越多,时

间复杂为O(n);

remove(int i):每一次删除,都需要把i位置后面的元素移动一次,随着数据量N的增大,移动的元素也越多,时间复

杂度为O(n);

由于顺序表的底层由数组实现,数组的长度是固定的,所以在操作的过程中涉及到了容器扩容操作。这样会导致顺

序表在使用过程中的时间复杂度不是线性的,在某些需要扩容的结点处,耗时会突增,尤其是元素越多,这个问题

越明显

1.1.5 java中ArrayList实现

java中ArrayList集合的底层也是一种顺序表,使用数组实现,同样提供了增删改查以及扩容等功能。

1.2 链表

之前我们已经使用顺序存储结构实现了线性表,我们会发现虽然顺序表的查询很快,时间复杂度为O(1),但是增删

的效率是比较低的,因为每一次增删操作都伴随着大量的数据元素移动。这个问题有没有解决方案呢?有,我们可

以使用另外一种存储结构实现线性表,链式存储结构。

链表是一种物理存储单元上非连续、非顺序的存储结构,其物理结构不能只管的表示数据元素的逻辑顺序,数据元

素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列的结点(链表中的每一个元素称为结点)组成,

结点可以在运行时动态生成。

image-20220126164440953

那我们如何使用链表呢?按照面向对象的思想,我们可以设计一个类,来描述结点这个事物,用一个属性描述这个

结点存储的元素,用来另外一个属性描述这个结点的下一个结点。

结点API设计:

image-20220126164509554

结点类实现:

   public class Node {//存储元素public T item;// 指向下一个结点public Node next;public Node(T item, Node next) {this.item = item;this.next = next;}}

生成链表:

   public static void main(String[] args) throws Exception {//构建结点Node<Integer> first = new Node<Integer>(11, null);Node<Integer> second = new Node<Integer>(13, null);Node<Integer> third = new Node<Integer>(12, null);Node<Integer> fourth = new Node<Integer>(8, null);Node<Integer> fifth = new Node<Integer>(9, null);//生成链表first.next = second;second.next = third;third.next = fourth;fourth.next = fifth;}

1.2.1 单向链表

单向链表是链表的一种,它由多个结点组成,每个结点都由一个数据域和一个指针域组成,数据域用来存储数据,

指针域用来指向其后继结点。链表的头结点的数据域不存储数据,指针域指向第一个真正存储数据的结点。

image-20220126164649204

1.2.1.1 单向链表API设计

image-20220126164729786

1.2.1.2 单向链表代码实现

public class LinkList<T> implements Iterable {// 记录首结点private Node head;// 当前链表的长度private int N;/*创建容量为capacity的SequenceList对象*/public LinkList() {// 初始化头结点this.head = new Node(null, null);// 初始化元素个数this.N = 0;}/*空置线性表*/public void clear() {this.head.next = null;this.N = 0;}/*判断线性表是否为空,是返回true,否返回false*/public boolean isEmpty() {return this.N == 0;}/*线性表的长度*/public int length() {return this.N;}/*读取并返回线性表中的第i个元素的值*/public T get(int i) {// 通过循环,从头结点开始往后找Node n = this.head.next;for (int index = 0; index < i; index++) {n = n.next;}return n.item;}/*向线性表中添加一个元素t*/public void insert(T t) {// 找到当前最后一个结点Node n = head;while (n.next != null) {n = n.next;}// 创建新结点,保存元素tNode newNode = new Node(t, null);// 让当前最后一个结点指向新结点n.next = newNode;// 元素的个数+1N++;}/*在线性表的第i个元素之前插入一个值为t的数据元素。*/public void insertBefore(int i, T t) {// 找到i位置前一个结点Node pre = head;for (int index = 0; index < i; index++) {pre = pre.next;}// 找到i位置的结点Node curr = pre.next;// 创建新结点,斌给钱新结点需要指向原来i位置的结点Node newNode = new Node(t, curr);// 原来i位置的前一个结点指向新结点即可pre.next = newNode;// 元素的个数+1N++;}/*删除并返回线性表中第i个数据元素。*/public T remove(int i) {// 找到i位置的前一个结点Node pre = head;for (int index = 0; index < i; index++) {pre = pre.next;}// 找到i位置的结点Node curr = pre.next;// 找到i位置的下一个结点Node nextNode = curr.next;// 前一个结点指向下一个结点pre.next = nextNode;//元素个数-1N--;return curr.item;}/*返回线性表中首次出现的指定的数据元素的位序号,若不存在,则返回-1。*/public int indexOf(T t) {// 从头结点开始·然找到每一个结点,取出item和t比较:如果相同,就找到了Node n = head;for (int i = 0; n.next != null; i++) {n = n.next;if (n.item.equals("t")) {return i;}}return -1;}public Iterator<T> iterator() {return new SIterator();}private class SIterator implements Iterator {private Node n;public SIterator() {this.n = head;}public boolean hasNext() {return n.next != null;}public Object next() {n = n.next;return n.item;}public void remove() {}}public class Node {//存储元素public T item;// 指向下一个结点public Node next;public Node(T item, Node next) {this.item = item;this.next = next;}}
}
public class LinkListTest {public static void main(String[] args) {// 创建单向链表对象LinkList<String> sl = new LinkList<String>();// 测试插入sl.insert("姚明");sl.insert("科比");sl.insert("麦迪");sl.insertBefore(2, "詹姆斯");for (Object s : sl) {System.out.println((String) s);}System.out.println("-----------------------");// 测试获取String getResult = sl.get(0);System.out.println("获取索引0处的值为:" + getResult);String getResult2 = sl.get(sl.length()-1);System.out.println("获取索引的值为:" + getResult2);// 测试删除String removeResult = sl.remove(0);System.out.println("获取索引0被删处的值为:" + removeResult);// 测试清空sl.clear();System.out.println("清空后的线性表中的元素个数为:" + sl.length());}
输出:
姚明
科比
詹姆斯
麦迪
-----------------------
获取索引0处的值为:姚明
获取索引的值为:麦迪
获取索引0被删处的值为:姚明
清空后的线性表中的元素个数为:0

1.2.2 双向链表

双向链表也叫双向表,是链表的一种,它由多个结点组成,每个结点都由一个数据域和两个指针域组成,数据域用

来存储数据,其中一个指针域用来指向其后继结点,另一个指针域用来指向前驱结点。链表的头结点的数据域不存

储数据,指向前驱结点的指针域值为null,指向后继结点的指针域指向第一个真正存储数据的结点。

image-20220126165009547

按照面向对象的思想,我们需要设计一个类,来描述结点这个事物。由于结点是属于链表的,所以我们把结点类作

为链表类的一个内部类来实现

1.2.2.1 结点API设计

image-20220126165041560

1.2.2.2 双向链表API设计

image-20220126165106049

1.2.2.3 双向链表代码实现

public class TowWayLinkList<T> implements Iterable {// 记录首结点private Node head;// 记录尾结点private Node last;// 当前链表的长度private int N;/*创建容量为capacity的SequenceList对象*/public TowWayLinkList() {// 初始化头结点this.head = new Node(null, null, null);// 初始化尾结点this.last = null;// 初始化元素个数this.N = 0;}/*空置线性表*/public void clear() {this.head.next = null;this.head.pre = null;this.head.item = null;this.last = null;this.N = 0;}/*判断线性表是否为空,是返回true,否返回false*/public boolean isEmpty() {return N == 0;}/*线性表的长度*/public int length() {return N;}/*获取第一个元素*/public T getFirst() {if (isEmpty()) {return null;}return head.next.item;}/*获取最后一个元素*/public T getLast() {if (isEmpty()) {return null;}return last.item;}/*读取并返回线性表中的第i个元素的值*/public T get(int i) {Node n = head.next;for (int index = 0; index < i; index++) {n = n.next;}return n.item;}/*向线性表中添加一个元素t*/public void insert(T t) {// 如果链表为空if (isEmpty()) {// 创建新结点Node newNode = new Node(t, head, null);// 让新结点称为尾结点last = newNode;// 让头结点指向尾结点head.next = last;} else {// 链表不为空Node oldLast = last;// 创建新结点Node newNode = new Node(t, oldLast, null);// 当前尾结点指向新结点oldLast.next = newNode;// 让新结点称为尾结点last = newNode;}N++;}/*在线性表的第i个元素之前插入一个值为t的数据元素。*/public void insertBefore(int i, T t) {// 找到i位置得前一个结点Node pre = head;for (int idnex = 0; idnex < i; idnex++) {pre = pre.next;}// 找到i位置得结点Node INode = pre.next;// 创建新结点Node newNode = new Node(t, pre, INode);//让i位置的前一个结点的下一个结点变为新结点pre.next = newNode;// 让i位置的前一个结点变为新结点INode.pre = newNode;// 元素个数+1N++;}/*删除并返回线性表中第i个数据元素。*/public T remove(int i) {// 找i位置的前一个结点Node pre = head;for (int index = 0; index < i; index++) {pre = pre.next;}// 找i位置的结点Node curr = pre.next;// 找到i位置的下一个结点Node nextNode = curr.next;// 让i位置的前一个结点的下一个结点变为i位置的下一个结点pre.next = nextNode;// 让i位置的下一个结点的上一个结点变为i位置的前一个结点nextNode.pre = pre;// 元素个数-1N--;return curr.item;}/*返回线性表中首次出现的指定的数据元素的位序号,若不存在,则返回-1。*/public int indexOf(T t) {Node n = head;for (int i = 0; n.next != null; i++) {n = n.next;if (n.next.equals(t)) {return i;}}return -1;}public Iterator<T> iterator() {return new SIterator();}private class SIterator implements Iterator {private Node n;public SIterator() {this.n = head;}public boolean hasNext() {return n.next != null;}public Object next() {n = n.next;return n.item;}public void remove() {}}public class Node {//存储元素public T item;// 指向下一个结点public Node next;// 指向上一个结点public Node pre;public Node(T item, Node pre, Node next) {this.item = item;this.next = next;this.pre = pre;}}
}
public class TowWayLinkListTest {public static void main(String[] args) {// 创建双向链表对象TowWayLinkList<String> sl = new TowWayLinkList<String>();// 测试插入sl.insert("姚明");sl.insert("科比");sl.insert("麦迪");sl.insertBefore(2, "詹姆斯");for (Object s : sl) {System.out.println((String) s);}System.out.println("-----------------------");// 测试获取String getResult = sl.get(0);System.out.println("获取索引0处的值为:" + getResult);String getResult2 = sl.get(sl.length()-1);System.out.println("获取索引的值为:" + getResult2);// 测试删除String removeResult = sl.remove(0);System.out.println("获取索引0被删处的值为:" + removeResult);// 测试清空
//        sl.clear();
//        System.out.println("清空后的线性表中的元素个数为:" + sl.length());System.out.println("----------------------------");System.out.println("第一个元素"+sl.getFirst());System.out.println("最后一个元素"+sl.getLast());}
}
输出:
姚明
科比
詹姆斯
麦迪
-----------------------
获取索引0处的值为:姚明
获取索引的值为:麦迪
获取索引0被删处的值为:姚明
----------------------------
第一个元素科比
最后一个元素麦迪

1.2.2.4 java中LinkedList实现

java中LinkedList集合也是使用双向链表实现,并提供了增删改查等相关方法

1.2.3 链表的复杂度分析

get(int i):每一次查询,都需要从链表的头部开始,依次向后查找,随着数据元素N的增多,比较的元素越多,时间

复杂度为O(n)

insert(int i,T t):每一次插入,需要先找到i位置的前一个元素,然后完成插入操作,随着数据元素N的增多,查找的

元素越多,时间复杂度为O(n);

remove(int i):每一次移除,需要先找到i位置的前一个元素,然后完成插入操作,随着数据元素N的增多,查找的

元素越多,时间复杂度为O(n)

相比较顺序表,链表插入和删除的时间复杂度虽然一样,但仍然有很大的优势,因为链表的物理地址是不连续的,

它不需要预先指定存储空间大小,或者在存储过程中涉及到扩容等操作,同时它并没有涉及的元素的交换。

相比较顺序表,链表的查询操作性能会比较低。因此,如果我们的程序中查询操作比较多,建议使用顺序表,增删

操作比较多,建议使用链表。

1.2.4 链表反转

单链表的反转,是面试中的一个高频题目。

需求:

原链表中数据为:1->2->3>4

反转后链表中数据为:4->3->2->1

反转API:

public void reverse():对整个链表反转

public Node reverse(Node curr):反转链表中的某个结点curr,并把反转后的curr结点返回

使用递归可以完成反转,递归反转其实就是从原链表的第一个存数据的结点开始,依次递归调用反转每一个结点,

直到把最后一个结点反转完毕,整个链表就反转完毕。

image-20220127195341084

    /*对整个链表反转*/public void reverse() {// 判断当前链表是否为空链表,如果是空链表,则结束运行,如果不是,则调用重载reverse方法,完成反转if (isEmpty()) {return;}reverse(head.next);}/*反转链表中的指定的结点curr,并把反转后的curr结点返回原本的顺序姚明科比詹姆斯麦迪*/public Node reverse(Node curr) {if (curr.next == null) {// 将姚明换成麦迪head.next = curr;// 返回麦迪return curr;}// 递归反转当前结点curr的下一个结点,返回值就是链表反转后当前结点的上一个结点Node pre = reverse(curr.next);// pre 为麦迪// curr为詹姆斯// 让返回的结点的下一个结点变为当前结点currpre.next = curr;// 把当前结点的下一个结点变为nullcurr.next = null;return curr;}
    public static void main(String[] args) {// 创建单向链表对象LinkList<String> sl = new LinkList<String>();// 测试插入sl.insert("姚明");sl.insert("科比");sl.insert("麦迪");sl.insertBefore(2, "詹姆斯");for (Object s : sl) {System.out.println((String) s);}System.out.println("--------------------------------");sl.reverse();for (Object s : sl) {System.out.println((String) s);}}
输出:
姚明
科比
詹姆斯
麦迪
--------------------------------
麦迪
詹姆斯
科比
姚明

1.2.5 快慢指针

快慢指针指的是定义两个指针,这两个指针的移动速度一块一慢,以此来制造出自己想要的差值,这个差值可以然

我们找到链表上相应的结点。一般情况下,快指针的移动步长为慢指针的两倍

1.2.5.1 中间值问题

  public static void main(String[] args) throws Exception {//创建结点Node<String> first = new Node<String>("aa", null);Node<String> second = new Node<String>("bb", null);Node<String> third = new Node<String>("cc", null);Node<String> fourth = new Node<String>("dd", null);Node<String> fifth = new Node<String>("ee", null);Node<String> six = new Node<String>("ff", null);Node<String> seven = new Node<String>("gg", null);//完成结点之间的指向first.next = second;second.next = third;third.next = fourth;fourth.next = fifth;fifth.next = six;six.next = seven;//查找中间值String mid = getMid(first);System.out.println("中间值为:"+mid);}/*** @param first 链表的首结点* @return 链表的中间结点的值*/public static String getMid(Node<String> first) {//定义两个指针Node<String> slow = first;Node<String> fast = first;//使用两个指针遍历链表,当快指针指向的结点没有下一个结点了,就可以结束了,结束之后,慢指针指向的结点就是中间值while (fast!=null && fast.next!=null){// 快指针fast = fast.next.next;// 慢指针slow = slow.next;}return slow.item;}//结点类private static class Node<T> {//存储数据T item;//下一个结点Node next;public Node(T item, Node next) {this.item = item;this.next = next;}}
输出:中间值为:dd

1.2.5.2 单向链表是否有环问题

image-20220127195918587

需求:

请完善测试类Test中的isCircle方法,返回链表中是否有环。

使用快慢指针的思想,还是把链表比作一条跑道,链表中有环,那么这条跑道就是一条圆环跑道,在一条圆环跑道

中,两个人有速度差,那么迟早两个人会相遇,只要相遇那么就说明有环。

    public static void main(String[] args) throws Exception {//创建结点Node<String> first = new Node<String>("aa", null);Node<String> second = new Node<String>("bb", null);Node<String> third = new Node<String>("cc", null);Node<String> fourth = new Node<String>("dd", null);Node<String> fifth = new Node<String>("ee", null);Node<String> six = new Node<String>("ff", null);Node<String> seven = new Node<String>("gg", null);//完成结点之间的指向first.next = second;second.next = third;third.next = fourth;fourth.next = fifth;fifth.next = six;six.next = seven;
//        //产生环
//        seven.next = third;//判断链表是否有环boolean circle = isCircle(first);System.out.println("first链表中是否有环:"+circle);}/*** 判断链表中是否有环* @param first 链表首结点* @return ture为有环,false为无环*/public static boolean isCircle(Node<String> first) {//定义快慢指针Node<String> fast = first;Node<String> slow = first;//遍历链表,如果快慢指针指向了同一个结点,那么证明有环while(fast!=null && fast.next!=null){//变换fast和slowfast = fast.next.next;slow = slow.next;if (fast.equals(slow)){return true;}}return false;}//结点类private static class Node<T> {//存储数据T item;//下一个结点Node next;public Node(T item, Node next) {this.item = item;this.next = next;}}
输出:first链表中是否有环:false

1.2.5.3 有环链表入口问题

需求:

请完善Test类中的getEntrance方法,查找有环链表中环的入口结点。

当快慢指针相遇时,我们可以判断到链表中有环,这时重新设定一个新指针指向链表的起点,且步长与慢指针一样

为1,则慢指针与“新”指针相遇的地方就是环的入口。证明这一结论牵涉到数论的知识,这里略,只讲实现。

  public static void main(String[] args) throws Exception {Node<String> first = new Node<String>("aa", null);Node<String> second = new Node<String>("bb", null);Node<String> third = new Node<String>("cc", null);Node<String> fourth = new Node<String>("dd", null);Node<String> fifth = new Node<String>("ee", null);Node<String> six = new Node<String>("ff", null);Node<String> seven = new Node<String>("gg", null);//完成结点之间的指向first.next = second;second.next = third;third.next = fourth;fourth.next = fifth;fifth.next = six;six.next = seven;//产生环seven.next = third;//查找环的入口结点Node<String> entrance = getEntrance(first);System.out.println("first链表中环的入口结点元素为:"+entrance.item);}/*** 查找有环链表中环的入口结点* @param first 链表首结点* @return 环的入口结点*/public static Node getEntrance(Node<String> first) {//定义快慢指针Node<String> fast = first;Node<String> slow = first;Node<String> temp = null;//遍历链表,先找到环(快慢指针相遇),准备一个临时指针,指向链表的首结点,继续遍历,直到慢指针和临时指针相遇,那么相遇时所指向的结点就是环的入口while(fast!=null && fast.next!=null){//变换快慢指针fast = fast.next.next;slow = slow.next;if (fast.equals(slow)){temp = first;continue;}// 让临时结点变换if (temp!=null){temp = temp.next;// 判断临时指针是否和慢指针相遇if (temp.equals(slow)){break;}}}return temp;}//结点类private static class Node<T> {//存储数据T item;//下一个结点Node next;public Node(T item, Node next) {this.item = item;this.next = next;}}
输出:first链表中环的入口结点元素为:cc

1.2.6 循环链表

循环链表,顾名思义,链表整体要形成一个圆环状。在单向链表中,最后一个节点的指针为null,不指向任何结

点,因为没有下一个元素了。要实现循环链表,我们只需要让单向链表的最后一个节点的指针指向头结点即可.

image-20220127200139719

1.2.7 约瑟夫问题

问题描述:

传说有这样一个故事,在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决

定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,第一个人从1开始报数,依次往

后,如果有人报数到3,那么这个人就必须自杀,然后再由他的下一个人重新从1开始报数,直到所有人都自杀身

亡为止。然而约瑟夫和他的朋友并不想遵从。于是,约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16

个与第31个位置,从而逃过了这场死亡游戏 。

问题转换:

41个人坐一圈,第一个人编号为1,第二个人编号为2,第n个人编号为n。

1.编号为1的人开始从1报数,依次向后,报数为3的那个人退出圈;

2.自退出那个人开始的下一个人再次从1开始报数,以此类推;

3.求出最后退出的那个人的编号。

图示:

image-20220127200407542

解题思路:

1.构建含有41个结点的单向循环链表,分别存储1~41的值,分别代表这41个人;

2.使用计数器count,记录当前报数的值;

3.遍历链表,每循环一次,count++;

4.判断count的值,如果是3,则从链表中删除这个结点并打印结点的值,把count重置为0;

 public static void main(String[] args) {// 解决约瑟夫问题//1.构建循环链表,包含41个结点,分别存储1~41的值// first :首结点// pre : 用来记录前一个结点Node<Integer> first = null;Node<Integer> pre = null;for (int i = 1; i <= 41; i++) {//  如果是第一个结点if (i == 1) {first = new Node<Integer>(i, null);pre = first;continue;}// 如果不是第一个结点Node<Integer> newNode = new Node(i, null);pre.next = newNode;pre = newNode;// 如果是最后一个结点,那么下一个结点为firstif (i == 41) {pre.next = first;}}// 2. 需要count计数器int count = 0;// 3.遍历循环链表// 记录每次遍历拿到的结点,默认从首结点开始Node<Integer> n = first;// 记录当前结点的上一个节点Node<Integer> before = null;while (n != n.next) {// 模拟报数count++;// 判断当前报数是不是为3if (count == 3) {// 如果是3,则把当前结点删除掉,打印当前结点,重置count=0,让当前结点n后移before.next = n.next;System.out.print(n.item+",");count=0;n = n.next;} else {// 如果不是3,让before变为当前结点,让当前结点后移before = n;n = n.next;}}// 打印最后一个元素System.out.println(n.item);}private static class Node<T> {//存储数据T item;//下一个结点Node next;public Node(T item, Node next) {this.item = item;this.next = next;}}
输出:
3,6,9,12,15,18,21,24,27,30,33,36,39,1,5,10,14,19,23,28,32,37,41,7,13,20,26,34,40,8,17,29,38,11,25,2,22,4,35,16,31

1.3

1.3.1.1 生活中的栈

存储货物或供旅客住宿的地方,可引申为仓库、中转站 。例如我们现在生活中的酒店,在古时候叫客栈,是供旅客

休息的地方,旅客可以进客栈休息,休息完毕后就离开客栈。

1.3.1.2 计算机中的栈

我们把生活中的栈的概念引入到计算机中,就是供数据休息的地方,它是一种数据结构,数据既可以进入到栈中,

又可以从栈中出去。

栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出

的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一

个数据被第一个读出来)。

我们称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈

image-20220128122907109

1.3.2 栈的实现

1.3.2.1 栈API设计

image-20220128122947360

1.3.2.2 栈代码实现
public class StackList<T> implements Iterable<T> {// 记录首结点private Node head;// 当前栈的元素个数private int N;public StackList() {this.head = new Node(null, null);this.N = 0;}/*** 判断栈是否为空,是返回true,否返回false** @return*/public boolean isEmpty() {return N == 0;}/*** 获取栈中元素的个数** @return*/public int size() {return N;}/*** 向栈中压入元素t** @return*/public void push(T t) {// 找到首结点指向的第一个结点Node<T> oldFirst = head.next;// 创建新结点Node<T> newNode = new Node(t, null);// 让首结点指向新结点head.next = newNode;// 让新结点指向原来的第一个结点newNode.next = oldFirst;// 元素个数+1N++;}/*** 弹出栈顶元素** @return*/public T pop() {// 找到首结点指向的第一个结点Node<T> oldFirst = head.next;if (oldFirst == null) {return null;}// 让首结点指向原来第一个结点的下一个结点head.next = oldFirst.next;// 元素个数-1N--;return oldFirst.item;}public Iterator<T> iterator() {return new SIterator();}private class SIterator implements Iterator<T>{private Node<T> curr;public SIterator() {this.curr = head;}public boolean hasNext() {return curr.next!=null;}public T next() {curr = curr.next;return curr.item;}public void remove() {}}private static class Node<T> {//存储数据T item;//下一个结点Node next;public Node(T item, Node next) {this.item = item;this.next = next;}}}
    public static void main(String[] args) {//创建栈对象StackList<String> stack = new StackList();//测试压栈stack.push("a");stack.push("b");stack.push("c");stack.push("d");for (String item : stack) {System.out.println(item);}System.out.println("------------------------------");//测试弹栈String result = stack.pop();System.out.println("弹出的元素是:"+result);System.out.println("剩余的元素个数:"+stack.size());}
输出:
d
c
b
a
------------------------------
弹出的元素是:d
剩余的元素个数:3

1.3.3 案例

1.3.3.1 括号匹配问题

问题描述:

给定一个字符串,里边可能包含"()"小括号和其他字符,请编写程序检查该字符串的中的小括号是否成对出现。
例如:
"(上海)(长安)":正确匹配
"上海((长安))":正确匹配
"上海(长安(北京)(深圳)南京)":正确匹配
"上海(长安))":错误匹配
"((上海)长安":错误匹配

示例代码:

public class BracketsMatchTest {public static void main(String[] args) {String str = "上海(长安)(())";boolean match = isMatch(str);System.out.println(str + "中的括号是否匹配:" + match);System.out.println();}/*** 判断str中的括号是否匹配** @param str 括号组成的字符串* @return 如果匹配,返回true,如果不匹配,返回false*/public static boolean isMatch(String str) {//1.创建栈对象,用来存储左括号StackList<String> chars = new StackList();//2.从左往右遍历字符串for (int i = 0; i < str.length(); i++) {String currChar = String.valueOf(str.charAt(i));//3.判断当前字符是否为左括号,如果是,则把字符放入到栈中if (currChar.equals("(")) {chars.push(currChar);} else if (currChar.equals(")")) {//4.继续判断当前字符是否是有括号,如果是,则从栈中弹出一个左括号,// 并判断弹出的结果是否为null,如果为null证明没有匹配的左括号,// 如果不为null,则证明有匹配的左括号String pop = chars.pop();if (pop == null) {return false;}}}//5.判断栈中还有没有剩余的左括号,如果有,则证明括号不匹配if (chars.size() == 0) {return true;} else {return false;}}
}
输出:
上海(长安)(())中的括号是否匹配:true
1.3.3.2 逆波兰表达式求值问题

逆波兰表达式求值问题是我们计算机中经常遇到的一类问题,要研究明白这个问题,首先我们得搞清楚什么是逆波

兰表达式?要搞清楚逆波兰表达式,我们得从中缀表达式说起。

中缀表达式:

中缀表达式就是我们平常生活中使用的表达式,例如:1+3*2,2-(1+3)等等,中缀表达式的特点是:二元运算符总

是置于两个操作数中间。

中缀表达式是人们最喜欢的表达式方式,因为简单,易懂。但是对于计算机来说就不是这样了,因为中缀表达式的

运算顺序不具有规律性。不同的运算符具有不同的优先级,如果计算机执行中缀表达式,需要解析表达式语义,做

大量的优先级相关操作。

逆波兰表达式(后缀表达式):

逆波兰表达式是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法,后缀表

达式的特点:运算符总是放在跟它相关的操作数之后。

image-20220128123405177

public class ReversePolishNotationTest {public static void main(String[] args) {//中缀表达式 3*(17-15)+18/6 的逆波兰表达式如下String[] notation = {"3", "17", "15", "-", "*", "18", "6", "/", "+"};int result = caculate(notation);System.out.println("逆波兰表达式的结果为:" + result);System.out.println(3 * (17 - 15) + 18 / 6);}/*** @param notaion 逆波兰表达式的数组表示方式* @return 逆波兰表达式的计算结果*/public static int caculate(String[] notaion) {//1.定义一个栈,用来存储操作数StackList<Integer> oprands = new StackList();//2.从左往右遍历逆波兰表达式,得到每一个元素for (int i = 0; i < notaion.length; i++) {String curr = notaion[i];Integer o1;Integer o2;Integer result;//3.判断当前元素是运算符还是操作数switch (curr) {//4.运算符,从栈中弹出两个操作数,完成运算,运算完的结果再压入栈中case "+":o1 = oprands.pop();o2 = oprands.pop();result = o2 + o1;oprands.push(result);break;case "-":o1 = oprands.pop();o2 = oprands.pop();result = o2 - o1;oprands.push(result);break;case "*":o1 = oprands.pop();o2 = oprands.pop();result = o2 * o1;oprands.push(result);break;case "/":o1 = oprands.pop();o2 = oprands.pop();result = o2 / o1;oprands.push(result);break;default:oprands.push(Integer.parseInt(curr));//5.操作数,把该操作数放入到栈中;break;}}//6.得到栈中最后一个元素,就是逆波兰表达式的结果int result = oprands.pop();return result;}}
输出:
逆波兰表达式的结果为:9
9

1.4 队列

队列是一种基于先进先出(FIFO)的数据结构,是一种只能在一端进行插入,在另一端进行删除操作的特殊线性表,它

按照先进先出的原则存储数据,先进入的数据,在读取数据时先读被读出来。

image-20220128131735677

1.4.1 队列的API设计

image-20220128131804700

1.4.2 队列的实现
public class Queue<T> implements Iterable<T> {//记录首结点private Node head;//记录最后一个结点private Node last;//记录队列中元素的个数private int N;public Queue() {this.head = new Node(null, null);this.last = null;N = 0;}//判断队列是否为空public boolean isEmpty() {return N == 0;}//返回队列中元素的个数public int size() {return N;}//向队列中插入元素tpublic void enqueue(T t) {// 当前尾结点last = nullif (last == null) {last = new Node(t, null);head.next = last;} else {// 当前尾结点last != nullNode oldLast = last;last = new Node(t, null);oldLast.next = last;}// 元素个数+1N++;}//从队列中拿出一个元素public T dequeue() {if (isEmpty()) {return null;}Node oldFirst = head.next;head.next = oldFirst.next;N--;//因为出队列其实是在删除元素,因此如果队列中的元素被删除完了,需要重置last=null;if (isEmpty()) {last = null;}return oldFirst.item;}@Overridepublic Iterator<T> iterator() {return new QIterator();}private class QIterator implements Iterator {private Node n;public QIterator() {this.n = head;}@Overridepublic boolean hasNext() {return n.next != null;}@Overridepublic Object next() {n = n.next;return n.item;}@Overridepublic void remove() {}}private class Node {public T item;public Node next;public Node(T item, Node next) {this.item = item;this.next = next;}}}
    public static void main(String[] args) {//创建队列对象Queue<String> q = new Queue<>();//测试队列的enqueue方法q.enqueue("a");q.enqueue("b");q.enqueue("c");q.enqueue("d");for (String str : q) {System.out.println(str);}System.out.println("-------------------------------");//测试队列的dequeue方法String result = q.dequeue();System.out.println("出队列的元素是:"+result);System.out.println("剩余的元素个数:"+q.size());}
输出:
a
b
c
d
-------------------------------
出队列的元素是:a
剩余的元素个数:3
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 做程序员的第八个年头——2021年个人工作总结

    本文由Markdown语法编辑器编辑完成。 1. 前言&#xff1a; 不知不觉中&#xff0c;我从研究生毕业实习(2013年2月)工作到现在(2022年1月)&#xff0c;已经有8年多的时间了。   在过去八年的职业生涯中&#xff0c;我共经历了两家公司。一家是国企控股的民营企业&#xff0c;…...

    2024/4/28 0:51:31
  2. CSS概述

    CSS 一、CSS概述 1、CSS概念 ​ CSS&#xff08;Cascading Style Sheet&#xff09;&#xff1a;层叠样式表语言。 2、CSS的作用 ​ 修饰HTML页面&#xff0c;设置HTML页面中的某些元素的样式&#xff0c;让HTML页面更好看。CSS好比是HTML的化妆品一样。 ​ HTML还是主体&…...

    2024/4/14 0:32:11
  3. Android HTTPS 自制证书实现双向认证(OkHttp + Retrofit + Rxjava)

    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加 RxJava 适配器 .client(okHttpClient)//添加OkHttp代理对象 .build(); /details/106252088)证书制作思路&#xff1a; 首先对于双向证书验证&#xff0c;也就是说&#xff0c; 客户端持有服务端的公钥证书…...

    2024/4/5 3:47:34
  4. python3.x安装HTMLTestRunner和使用

    1、测试环境&#xff1a; Python3.5unittestHTMLTestRunner 2、下载HTMLTestRunner.py文件 下载地址 HTMLTestRunner - tungwaiyips software   右键单击保存至本地&#xff0c;放在Python的安装目录Lib文件夹下&#xff08;我本地放在本目录下&#xff1a;D:\setup\Python35…...

    2024/4/15 18:10:20
  5. java项目-第22期基于ssm培训机构学生成绩管理系统

    java项目-第22期基于ssm培训机构学生成绩管理系统 1、项目简述 功能&#xff1a; 分为管理员、教师、学生三个角色 管理员&#xff1a;教师信息管理、学生信息管理、课程信息管理、学生成绩管理、登录 教师&#xff1a;学生信息管理、课程信息管理、教师个人信息管理、学生成绩…...

    2024/4/26 12:28:28
  6. Spring面试突击

    Spring面试的一些知识总结。 文章目录一、说说Spring 里用到了哪些设计模式?二、谈谈你对IOC 和 AOP 的理解&#xff1f;他们的实现原理是什么&#xff1f;三、JDK 动态代理和 CGLIB 代理有什么区别&#xff1f;四、Spring AOP 和 AspectJ AOP 有什么区别&#xff1f;五、Fact…...

    2024/4/7 18:18:34
  7. Numpy - 1.22.0 详细笔记

    Numpy介绍 NumPy是Python中科学计算的基本包。它是一个Python库&#xff0c;提供了一个多维数组对象&#xff0c;各种派生对象&#xff08;如屏蔽数组(masked arrays)和矩阵&#xff09;&#xff0c;以及用于对数组进行快速操作的各种例程&#xff0c;包括数学&#xff0c;逻辑…...

    2024/4/7 18:18:32
  8. Web应用十大安全漏洞

    Web应用十大安全漏洞 开放Web应用程序安全项目通过调查&#xff0c;列出了对Web应用的危害较大的10个安全问题&#xff0c;也是业界集中关注最严重的问题。主要包括:未验证参数、访问控制缺陷、账户及会话管理缺陷、跨网站脚本漏洞、缓冲区溢出、命令注入漏洞、错误处理问题、密…...

    2024/4/16 6:56:02
  9. (74)C#里怎么样调用WIN API的函数时实现回调函数

    (74)C#里怎么样调用WIN API的函数时实现回调函数 在C#里开发,当你调用WIN API函数或者自己定义的C++库时,需要给调用的函数设置一个回调函数,这时候又需要怎么样来实现呢? 在C#里显然使用委托函数来实现回调函数比较简单。 比如像下面的C++函数: BOOL EnumWindows(WND…...

    2024/4/14 0:32:26
  10. ESP8266一直闪蓝灯,不停复位的解决办法

    问题&#xff1a; 在一次下载中无意间将下载的文件选错&#xff0c;再次下载完成后就突然一直闪蓝灯&#xff0c;不停复位。这并不是ESP8266模组坏了。 解决办法&#xff1a; 1.我们平常下载程序选择eagle.flash.bin和eagle.irom0text.bin即可。 2.但是出现以上错误后&#x…...

    2024/4/16 22:07:22
  11. 筷子(c++)

    【问题描述】 A 先生有很多双筷子。确切的说应该是很多根&#xff0c;因为筷子的长度不一&#xff0c;很难判断出哪两根是一双的。这天&#xff0c;A 先生家里来了 K 个客人&#xff0c;A 先生留下他们吃晚饭。加上 A 先生&#xff0c;A 夫人和他们的孩子小 A&#xff0c;共 K…...

    2024/4/16 21:42:39
  12. 在 Linux 中追加到内容的末尾

    在本教程中&#xff0c;我们学习了在 Linux 中将文本附加到文件末尾的不同方法。您可以在 Linux 中使用多种方法来实现此目的&#xff0c;但最简单的一种是将命令输出重定向到所需的文件名。使用 >> 字符&#xff0c;您可以将任何命令的结果输出到文本文件。 其他可以实…...

    2024/4/20 11:11:12
  13. 三星M8 智能显示器 评测

    三星 M8 智能显示器&#xff0c;搭载 32 英寸 4K 屏&#xff0c;支持作为智能家居中控&#xff0c;以及云游戏。 三星M8 显示器的厚度为 11.4 毫米&#xff0c;三星称其厚度比之前的型号要薄得多。该显示器还配备磁吸的可移动 SlimFit 摄像头&#xff0c;可以连接到显示器进行视…...

    2024/4/7 18:18:27
  14. Android - 更安全地保存静态密钥,androidble开发教程

    在日常开发中我们经常需要保存一些私密的信息&#xff0c;例如加解密的密钥等等。这时候我们就要来考虑如何存储密钥了。先来简单介绍几种存储方式&#xff1a; Java硬编码方式 SharedPreferences存储 文件存储 数据库存储 以上几种存储方式是很不安全的&#xff0c;例如采…...

    2024/4/7 18:18:25
  15. JAVA-list.stream()各种操作

    List<Integer> list new ArrayList<Integer>(); 从小到大方法&#xff1a;Collections.sort(list); 从大到小方法&#xff1a;Collections.sort(list,Collections.reverseOrder()); stream获取list中的某个元素集合: List<Integer> agesstudentList.str…...

    2024/4/20 1:11:04
  16. 关于404 Not Found [IP: 2001:67c:1560:8008::19 80]报错的个人解决方案

    关于404 Not Found [IP: 2001:67c:1560:8008::19 80]报错的个人解决方案 解决方案&#xff1a; cd /etc/apt/sources.list.d 将此目录文件全部删除 正文 apt install xxx或apt update时 命中:1 http://packages.microsoft.com/repos/code stable InRelease 命中:2 https://mi…...

    2024/4/19 14:43:19
  17. CTFHub - 信息泄露 -- HG泄露

    跟前面svn差不多&#xff0c;只是这里用的是dvcs里的hg工具 ps&#xff1a;附上svn wp ./rip-hg.pl -v -u http://challenge-24f303b3736695ae.sandbox.ctfhub.com:10800/.hg这里发现flag.txt查看失败&#xff0c;放在网站里面试一下 得到flag...

    2024/4/20 7:53:36
  18. Vladik and Complicated Book

    题意给你一个 n 长数组 &#xff0c;m 次排序 让你看看第x位的数组是否发生改变 l - r 之间的数从小到大排的 &#xff0c; 因此我们只要看当前数在排序的数字中排第几 &#xff0c;就可以判定是否相等 #include"bits/stdc.h" #define ll long long #define pi pai…...

    2024/4/19 1:11:10
  19. 二元运算符的运算符规则

    一&#xff0c;整数运算 如果两个操作数有一个为long&#xff0c;则结果也为long. 没有long时&#xff0c;结果为int。即使操作数全为byte&#xff0c;short&#xff0c;结果也是int。 二&#xff0c;浮点运算 如果两个操作数有一个为double,则结果为double。 只有两个操作…...

    2024/4/26 18:42:32
  20. GEEer成长日记五:Sentinel-2计算NDVI并逐月时间序列分析

    前几期我们介绍了MODIS和LANDSAT8遥感影像的MDVI时间序列&#xff0c;其他数据也与此类似&#xff0c;大家根据实际情况修改即可。本期我们介绍Sentinel-2 Level-2A数据在时间序列方面的研究。 COPERNICUS/S2_SR 如果想深入了解这两个数据集&#xff0c;可以登录: https://s…...

    2024/4/20 5:36:38

最新文章

  1. pyaibote--安卓自动化环境配置与基础的使用方法

    前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 pyaibote介绍 pyaibote是一个全新&#xff0c;强大的办公自动化库。 支持找图&#xff0c;识别像素等操作。 比appium快十倍。 文章介绍 有大佬给我提到这个库后&#xff0c;我来查看。然后发现这个库太新了&am…...

    2024/4/28 7:29:08
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 第十二届蓝桥杯省赛真题(C/C++大学B组)

    目录 #A 空间 #B 卡片 #C 直线 #D 货物摆放 #E 路径 #F 时间显示 #G 砝码称重 #H 杨辉三角形 #I 双向排序 #J 括号序列 #A 空间 #include <bits/stdc.h> using namespace std;int main() {cout<<256 * 1024 * 1024 / 4<<endl;return 0; } #B 卡片…...

    2024/4/28 0:30:06
  4. STM32-GPIO

    &#x1f913;&#x1f913;&#x1f913; 122.1 2.22.3 344.14.24.34.44.54.64.74.8 56788.18.299.19.2 STM32 第一个外设 1 对我们来说 和IO口没区别 ST公司非叫GPIO 2 2.1 第二个是超频了 F1 72M 这翻转就36 2.2 有cmos 和ttl两种数据手册里给出整个芯片最低电流为150ma 单…...

    2024/4/22 10:11:05
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57