下压堆栈的实现方式

算法第四版学习笔记一(下压堆栈的实现)

使用数组和链表两种实现方式
数组实现方式:

 1package ren.laughing.algorithms;
 2
 3import java.util.Iterator;
 4
 5/**
 6 * 下压堆栈(数组实现)
 7 * 
 8 * @author Laughing_Lz
 9 * @createTime 2018年9月2日
10 * @param <E>
11 */
12public class ResizingArrayStack<Eimplements Iterable<E{
13
14  private E[] items = (E[]) new Object[1];
15  private int N = 0;
16
17  public boolean isEmpty() {
18    return N == 0;
19  }
20
21  public int size() {
22    return N;
23  }
24
25  /**
26   * 动态调整数组大小 保持数组大小与栈大小之比小于一个常数
27   * 
28   * @param max 调整后的数组长度
29   */
30  public void resize(int max) {
31    E[] temp = (E[]) new Object[max];
32    for (int i = 0; i < N; i++) {
33      temp[i] = items[i];
34    }
35    items = temp;
36  }
37
38  public void push(E item) {
39    if (N == items.length) {
40      resize(2 * items.length);
41    }
42    items[N++] = item;
43  }
44
45  public E pop() {
46    E item = items[--N];
47    // 避免对象游离
48    items[N] = null;
49    if (N > 0 && N == items.length / 4) {
50      resize(items.length / 2);
51    }
52    return item;
53  }
54
55  /**
56   * 实现foreach遍历
57   */
58  @Override
59  public Iterator<E> iterator() {
60    return new StackIterator();
61  }
62
63  private class StackIterator implements Iterator<E{
64    private int i = N;
65
66    @Override
67    public boolean hasNext() {
68      return i > 0;
69    }
70
71    @Override
72    public E next() {
73      return items[--i];
74    }
75
76  }
77}

链表实现方式:

 1package ren.laughing.algorithms;
 2
 3import java.util.Iterator;
 4
 5/**
 6 * 下压堆栈(链表实现)
 7 * 
 8 * @author Laughing_Lz
 9 * @createTime 2018年9月2日
10 * @param <E>
11 */
12public class Stack<Eimplements Iterable<E{
13
14  private Node first;
15  private int N;
16
17  private class Node {
18    E item;
19    Node next;
20  }
21
22  public boolean isEmpty() {
23    return N == 0;
24  }
25
26  public int size() {
27    return N;
28  }
29
30  public void push(E item) {
31    Node oldfirst = first;
32    first = new Node();
33    first.item = item;
34    first.next = oldfirst;
35    N++;
36  }
37
38  public E pop() {
39    E item = first.item;
40    first = first.next;
41    N--;
42    return item;
43  }
44
45  /**
46   * 实现foreach遍历
47   */
48  @Override
49  public Iterator<E> iterator() {
50    return new StackIterator();
51  }
52
53  private class StackIterator implements Iterator<E{
54
55    private Node current = first;
56
57    @Override
58    public boolean hasNext() {
59      return first != null;
60    }
61
62    @Override
63    public E next() {
64      E item = current.item;
65      current = first.next;
66      return item;
67    }
68
69  }
70}

搭建docker本地私有仓库

一:准备工作如下:

1、建立相关文件夹:

[root@iZ28bi7khfvZ registry]# pwd
/laughing/registry
[root@iZ28bi7khfvZ registry]# ls
config.yml docker

2、上传配置文件config.yml至服务器/laughing/registry目录下,内容如下:

[root@iZ28bi7khfvZ registry]# vi config.yml

version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff] health:
storagedriver:
enabled: true
interval: 10s
threshold: 3

3、从官方仓库中pull下registry镜像:

docker pull registry

二:开始运行registry镜像

运行registry镜像时要挂载仓库目录,挂载配置文件,指定端口,如下:

docker run -d -p 5000:5000 -v /laughing/registry/:/var/lib/registry -v /laughing/registry/config.yml:/etc/docker/registry/config/yml –name registry –restart=always registry

运行上条指令后可看到registry容器已经启动啦:

[root@iZ28bi7khfvZ registry]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47602f950bf9 registry “/entrypoint.sh /etc…” 37 minutes ago Up 30 minutes 0.0.0.0:5000->5000/tcp registry

三:测试

例如将本地已有的镜像上传至仓库中:

将本地镜像打标签;

docker tag base:jdktomcat IP:5000/base:jdktomcat

然后推送到私有仓库中:

docker push IP:5000/base:jdktomcat

此时出现错误:http: server gave HTTP response to HTTPS client

因为docker与docker registry默认交互使用https,而我们搭建的私有仓库使用http服务

因此需要在服务器上配置如下:

vim /usr/lib/systemd/system/docker.service

找到ExecStart=/usr/bin/dockerd这一行 在后面追加  –insecure-registry IP:5000

保存后需要重启docker

systemctl daemon-reload

ststemctl restart docker.service

此时再次执行docker push IP:5000/base:jdktomcat

发现已可推送成功

通过查看仓库镜像来确认下:

[root@iZ28bi7khfvZ registry]# curl -get http://IP:5000/v2/_catalog
{“repositories”:[“base”]}

[root@iZ28bi7khfvZ registry]# curl -get http://IP:5000/v2/base/tags/list
{“name”:”base”,”tags”:[“jdktomcat”]}

至此我们已确认私有仓库搭建完成!

参考链接:https://www.cnblogs.com/Tempted/p/7768694.html

数码视讯宣讲会现场笔试题

数码视讯宣讲会现场笔试题:

1、list长度为100,用两个线程交换取出5个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package ren.laughing.test.shumashixun;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * 两个线程,交换取出5个元素,直到list为空
 * 
 * @author Laughing_Lz
 * @time 2016年9月29日
 */
class SynList {
    public List list = new ArrayList();
 
    public synchronized void get5Counts1() {
        if (list.size() == 0) {
            System.out.println("list已为空,无法取出!");
        } else {
            System.out.println("执行线程1");
            for (int i = 0; i < 5; i++) {
                System.out.println(list.get(0));
                list.remove(0);
            }
            System.out.println("已取出5个");
            try {
                wait();// wait写在前面
                if (list.size() == 0) {
                    System.out.println("list已为空,无法取出!");
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            notify();
        }
    }
 
    public synchronized void get5Counts2() {
        if (list.size() == 0) {
            System.out.println("list已为空,无法取出!");
        } else {
            System.out.println("执行线程2");
            for (int i = 0; i < 5; i++) {
                System.out.println(list.get(0));
                list.remove(0);
            }
            System.out.println("已取出5个");
            notify();// notify写在前面
            try {
                wait();
                if (list.size() == 0) {
                    System.out.println("list已为空,无法取出!");
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
 
    public void set100Counts() {
        for (int i = 0; i < 100; i++) {
            list.add(i);
        }
    }
}
 
class SynQueue1 implements Runnable {
    private SynList synList;
 
    public SynQueue1(SynList synList) {
        super();
        this.synList = synList;
    }
 
    @Override
    public void run() {
        while (synList.list.size() >= 5) {
            synList.get5Counts1();
        }
    }
}
 
class SynQueue2 implements Runnable {
    private SynList synList;
 
    public SynQueue2(SynList synList) {
        super();
        this.synList = synList;
    }
 
    @Override
    public void run() {
        while (synList.list.size() >= 5) {
            synList.get5Counts2();
        }
    }
}
 
public class SynQueue {
    public static void main(String[] args) {
        SynList synList = new SynList();
        synList.set100Counts();
        new Thread(new SynQueue1(synList)).start();
        new Thread(new SynQueue2(synList)).start();
        ;
    }
}

2、给定日期,获得当月最后一天和上两个月的第一天

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package ren.laughing.test.shumashixun;
 
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
 
/**
 * 关于获取某月份的第一天和最后一天
 * 
 * @author Laughing_Lz
 * @time 2016年9月29日
 */
public class AboutDate {
    /**
     * 以传入日期起,获取i个月后的第一天
     * 
     * @param strDate
     * @param i
     * @return
     * @throws ParseException
     */
    public String getFirstDayOfMonth(String strDate, int i) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse(strDate);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, i);// 添加i个月份
        cal.set(Calendar.DAY_OF_MONTH, 1);// 设置cal为当前日期的第一天
        String firstDayOfMonth = sdf.format(cal.getTime());
        return firstDayOfMonth;
    }
 
    /**
     * 以传入日期起,获取i个月后的最后一天
     * 
     * @param strDate
     * @param i
     * @return
     * @throws ParseException
     */
    public String getLastDayOfMonth(String strDate, int i) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse(strDate);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, i + 1);// cal月份加1
        cal.set(Calendar.DAY_OF_MONTH, 1);// 设置cal为当前月份的第一天
        cal.add(Calendar.DATE, -1);// cal日期加(-1)天
        String lastDayOfMonth = sdf.format(cal.getTime());
        return lastDayOfMonth;
    }
 
    public static void main(String[] args) throws ParseException {
        String strDate = "2016-09-28";
        String result1 = new AboutDate().getFirstDayOfMonth(strDate, 0);
        System.out.println(result1);
        String result2 = new AboutDate().getLastDayOfMonth(strDate, -2);
        System.out.println(result2);
    }
}

3、统计某文件夹下包含的jsp,xml,java文件总行数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package ren.laughing.test.shumashixun;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 统计某文件夹下包含的jsp,xml,java文件总行数
 * 
 * @author Laughing_Lz
 * @time 2016年9月29日
 */
public class AboutFile {
    public static int count4Java = 0;
    public static int count4Xml = 0;
    public static int count4Jsp = 0;
 
    /**
     * 遍历获得某文件夹下所有文件
     * 
     * @param str
     * @param fileList
     * @return
     */
    public List<String> GetFiles(String str, List<String> fileList) {
        File file = new File(str);
        File[] files = file.listFiles();// 列出所有子文件和路径
        // String[] files = file.list();//列出所有子文件和路径名
        for (int i = 0; i < files.length; i++) {
            if (files[i].isDirectory()) {// 是目录,递归
                // str = str + "\\" + files[i].getName();//拼接子文件夹路径
                fileList = GetFiles(files[i].getAbsolutePath(), fileList);// 传入子文件夹绝对路径名,继续遍历
            } else {
                fileList.add(files[i].getAbsolutePath());// 是文件,将绝对路径名放入list
            }
        }
        return fileList;
    }
 
    /**
     * 统计各类文件的总行数
     * 
     * @param fileList
     */
    public void getCounts(List<String> fileList) {
        for (String file : fileList) {
            try {
                BufferedReader br = new BufferedReader(new FileReader(new File(file)));
                String oneLine = br.readLine();
                while (oneLine != null) {
                    if (file.endsWith(".java")) {
                        count4Java++;
                    } else if (file.endsWith(".xml")) {
                        count4Xml++;
                    } else if (file.endsWith(".jsp")) {
                        count4Jsp++;
                    }
                    oneLine = br.readLine();
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
 
        }
        System.out.println("java文件总行数:" + count4Java + "\n" + "jsp文件总行数:" + count4Jsp + "\n" + "xml文件总行数:" + count4Xml);
    }
 
    public static void main(String[] args) {
        List<String> fileList = new ArrayList<String>();
        String str = "G:\\test";
        AboutFile af = new AboutFile();
        af.GetFiles(str, fileList);
        af.getCounts(fileList);
    }
}