1.文章编辑

问题描述:

输入一页文字,可以统计出文字、数字、空格的个数。

基本要求:

⑴静态存储一页文章,每行最多不超过80个字符,共N行。

⑵分别统计出其中英文字母和空格数及整篇文章总字数。

⑶统计某一字符串在文章中出现的次数,并输出该次数。

⑶删除某一子串,并将后面的字符前移。

⑷存储结构使用线性表,分别用几个子函数实现相应的功能。

代码:

import java.util.Scanner;

public class Test1 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要输入的行数:");
        int hs = sc.nextInt();
        sc.nextLine();
        System.out.println("请输入文章:");
        String[] ch = new String[hs];
        for (int i = 0; i < hs; i++) {
            ch[i] = sc.nextLine();
            if (ch[i].length() > 80) {
                System.out.println("每行最多不可超过80个字符,请重新输入");
                i--;
            }
        }
        int szCount = 0;//数字的个数
        int zmCount = 0;//字母的个数
        int kgCount = 0;//空格的个数
        int OtherCount = 0;//其他字符的个数
        for (int i = 0; i < hs; i++) {
            //char b[]=ch[j].toCharArray();//将字符串转换成一个新的字符数组
            for (int j = 0; j < ch[i].length(); j++) {
                if (ch[i].charAt(j) >= '0' && ch[i].charAt(j) <= '9') {
                    szCount++;
                } else if (ch[i].charAt(j) >= 'a' && ch[i].charAt(j) <= 'z' || ch[i].charAt(j) >= 'A' && ch[i].charAt(j) <= 'Z') {
                    zmCount++;
                } else if (ch[i].charAt(j) == ' ') {
                    kgCount++;
                } else {
                    OtherCount++;
                }
            }
        }
        int sum = zmCount + szCount + kgCount + OtherCount;
        System.out.println("总字符数为:" + sum);
        System.out.println("字符串中含有英文字符数为:" + zmCount);
        System.out.println("字符串中含有数字数目为:" + szCount);
        System.out.println("字符串中含有空格数目为:" + kgCount);
        System.out.println("字符串中含有其他字符数目为:" + OtherCount);
        boolean b = true;
        while (b) {
            System.out.println();
            System.out.println("请输入数字选择功能:");
            System.out.println("(1)统计某一字符串在文章中出现的次数");
            System.out.println("(2)删除某一子串");
            System.out.println("(3)查看文章");
            switch (sc.nextInt()) {
                case 1: {
                    System.out.println("请输入要统计的字符串:");
                    sc.nextLine();
                    String str = sc.nextLine();
                    System.out.println("字符" + str + "在文章中共出现次数为:" + count(str, ch));
                    break;
                }
                case 2: {
                    System.out.println("请输入要删除的字符串:");
                    sc.nextLine();
                    String str = sc.nextLine();
                    System.out.println(count(str, ch) + "条数据已删除");
                    delete(str, ch);
                    break;
                }
                case 3: {
                    print(ch);
                    break;
                }
                case 0: {
                    b = false;
                    break;
                }
            }
        }
    }

    public static int count(String s, String[] ch) {
        int count = 0;
        for (String value : ch) {
            while (value.contains(s)) {
                value = value.substring(value.indexOf(s) + s.length());
                ++count;
            }
        }
        return count;
    }

    public static void delete(String s, String[] ch) {

        int i = 0;

        for (String value : ch) {
            while (value.contains(s)) {
                value = value.replace(s, "");
                ch[i] = value;
            }
//            while (value.contains(s)) {
//                char[] c = value.toCharArray();
//                for (int i = value.indexOf(s);i<value.length()-1; i++) {
//                    c[i] = c[i+ ch.length];
//                   ch[j] = Arrays.toString(c);
//                   j++
//                }
//            }
            i++;
        }
    }

    public static void print(String[] ch) {
        for (String value : ch) {
            System.out.println(value);
        }
    }
}

运行截图:

数据结构与算法应用实践教程 数据结构与算法实训_数据结构

2.约瑟夫环

问题描述:

编号为1,2… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。

基本要求:

⑴利用单循环链表作为存储结构模拟此过程;

⑵键盘输入总人数、初始报数上限值m及各人密码;

⑶按照出列顺序输出各人的编号。  

代码:

import java.util.Scanner;

class Linklist {
    public class Node {       //节点
        public int password;  //密码
        public int number;    //顺序
        public Node next;     //指针

        public Node(int password, int number) {
            this.password = password;
            this.number = number;
        }
    }//节点
    private Node head;  //头结点
    public Linklist()  //构造方法
    {
        this.head = null;
    }
    //尾插法
    public void addLast(int n){
        int i;
        Scanner scanner = new Scanner(System.in);
        for(i=0;i<n;i++)
        {
            int password = scanner.nextInt();
            int number = i+1;
            Node node = new Node(password,number);
            if(this.head == null){
                this.head = node;
            }else {
                Node cur = this.head;
                while(cur.next != null){
                    cur = cur.next;
                }
                cur.next = node;
            }
            if(i==n-1)
            {
                node.next = this.head;//尾结点指向头节点
            }
        }
        scanner.close();
    }
    public void Ring(int M,int N)
    {
        Node Ring = this.head;
        int i,j,temp=M;
        for (j = 0; j < N; j++)
        {
            for (i = 1; i < temp-1; i++)
            {
                Ring = Ring.next;
            }
            if (temp == 1)
            {
                System.out.print(Ring.number+"\t");
                Ring = Ring.next;
            }
            else
            {
                System.out.print(Ring.next.number+"\t");  //找到要删除的节点的前一个节点
                temp = Ring.next.password;       //也可以不删除节点
                Node p = Ring.next;
                Ring.next = p.next;
                Ring = Ring.next;
            }
        }
    }
}
public class Test2 {
    public static void main(String[]args)
    {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入报数的上限:");
        int m = scanner.nextInt();
        System.out.println("请输入报数人数:");
        int n = scanner.nextInt();
        System.out.println("请依次输入密码");
        Linklist list = new Linklist();
        list.addLast(n);
        list.Ring(m,n);
    }
}

运行截图:

3.八皇后问题

代码:

import java.util.Arrays;
public class Test3 {
    int max = 8; //皇后数量
    int[] array = new int[max];
    int count = 0;
    public static void main(String[] args) {
        Test3 test = new Test3();
        test.push(0);
        System.out.println("共有"+test.count+"种摆法");
    }
    public void push(int n) {
        if (n == max) {
            count++;
            System.out.println(Arrays.toString(array));
            return;
        }
        for (int i = 0; i < 8; i++) {
            array[n] = i;
            if (examine(n)) {
                push(n + 1);
            }
        }
    }
    public boolean examine(int n) {
        for (int i = 0; i < n; i++) {
            if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[i] - array[n])) {
                //再同一列或同一条斜线上
                return false;
            }
        }
        return true;
    }
}

运行截图:

数据结构与算法应用实践教程 数据结构与算法实训_算法_02

4. 简单目录管理系统的设计与实现

基本要求:

利用树型结构设计并实现一个简单的目录管理系统,该系统可以对所有目录进行管理,如目录的新建、删除、查询、目录名称修改、按某种顺序输出所有目录(树的遍历操作)、以树型结构输出所有目录等功能。

代码:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class Test4 {
    int line=0;
    String str="";
    String word;
    int count;
    public void newFile() throws IOException {
        System.out.println("请输入文件地址:");
        Scanner scanner=new Scanner(System.in);
        String path =scanner.next();
        File file = new File(path);
        if(!file.exists()){
            file.getParentFile().mkdirs();
        }
        file.createNewFile();

        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        System.out.println("请输入要查询的单词:");
        word=scanner.next();
        char[]w=word.toCharArray();
        while((str=br.readLine())!=null) {
            line++;
            char[]st=str.toCharArray();
            if(KMP(st,w)==true) {   //查询单词位置,true表示该单词出现在这一行
                System.out.println("在第" + line + "行");
            }
        }
        br.close();
        fr.close();

    }

    public boolean KMP(char[] str,char[] ptr){//KMP方法查找单词
        //计算模式子串的next数组
        int[] next=cal_next(ptr);
        boolean flag=false;
        int slen=str.length;
        int plen=ptr.length;//子串的长度
        int num=0;//存放查询单词位置
        int j=-1;
        for(int i=0;i<slen;i++){
            while(j>-1&&ptr[j+1]!=str[i]){
                j=next[j];
            }
            if(ptr[j+1]==str[i]){
                j=j+1;
            }
            if(Character.isSpaceChar(str[i])){
                num++;//词数位置+1
            }
            if(j==(plen-1)){
                j=0;
                count++;
                System.out.println("该单词第"+count+"次"+"出现的位置在第"+(num+1)+"个单词");//存在则输出位置
                flag= true;
            }
        }
        return flag;
    }

    public int[] cal_next(char[] s) {
        int len = s.length;
        int[] next = new int[len];
        next[0] = -1;
        int k = -1;//k表示s[0,k]字符串的最长前缀等于最长后缀时的最长前缀长度减去1
        //遍历长度为n的子串,时间复杂度O(n)
        for (int q = 1; q <= (len - 1); q++) {
            //如果下一个不同,那么k就变成next[k],注意next[k]是小于k的,无论k取任何值。
            while (k > -1 && s[k + 1] != s[q]) {
                k = next[k];//往前回溯
            }
            if (s[k + 1] == s[q]) {
                k = k + 1;
            }
            //这个是把算的k的值(就是相同的最大前缀或最大后缀的长度减去1)赋给next[q]
            next[q] = k;
        }
        return next;
    }

    public void start() throws IOException {
        newFile();
        if(count>0) {
            System.out.println("该单词总共出现了" + count + "次");
        }else{
            System.out.println("该单词在文中不存在!");
        }

    }

    public static void main(String[] args) throws IOException {
        Test4 f=new Test4();
        f.start();
    }
}

运行截图: 

数据结构与算法应用实践教程 数据结构与算法实训_java_03