在Java中使用堆栈

时间:2018-06-20 15:34:17

标签: java stack

我是学习Java的新手,对此有些困难。我应该使用堆栈来对导入文件的痕迹进行族谱分析。我已经阅读了文件,并使用了堆栈数组来保存对象。用户输入两个名称以查看是否存在关系。如果有,应该说有关系。我不知道我是否朝着正确的方向前进,所以我只是在寻求一点帮助。我并不是要别人为我编码,我只是想从建议中学习。到目前为止,这是我的代码。

import java.io.*;
import java.util.*;

public class TracingGenealogies 
{

    public static void main(String[] args) throws FileNotFoundException
    {
        File file = new File("genealogy.txt");
        Scanner inputFile = new Scanner(file);
        Scanner keyboard = new Scanner(System.in);
        String childName;

        int numChildren;
        int numLines;
        int counter = 0;
        String parentName;

        numLines = inputFile.nextInt();

        Stack[] arr = new Stack[numLines];

        while (inputFile.hasNext())
        {
            Stack stack = new Stack();

            stack.push(inputFile.next());

            numChildren = inputFile.nextInt();

            for (int i = 0; i < numChildren; i++)
            {
                stack.push(inputFile.next());
            }

            arr[counter] = stack;
            counter++;
        }

        System.out.println("Enter 2 names to see if they are a descendant.");
        System.out.println("Enter the parent name: ");
        parentName = keyboard.nextLine();
        System.out.println("Enter a childs name: ");
        childName = keyboard.nextLine();

我正在读取的文件如下:

10

Al      3   Beth Carol Dino

Beth    1   Pablo

Carol   3   Ben Alex Mary

Dino    0

Pablo   2   Angela Miguel

Ben     0

Alex    0

Mary    0

Angela  0

Miguel  0

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

这是通过数据结构查找特定父母的孩子的代码。为了找到关系,您必须了解有关数据的一些特征。首先是识别父级与子级,父级的堆栈大小大于1。如果堆栈的大小为1,则说明您有一个孩子。因此,您需要搜索所有父级,而忽略子级堆栈。接下来就是简单地循环堆栈,直到找到孩子的名字或找不到孩子的名字为止。

尝试一下

    //loop the array of stacks
    for(int index = 0; index < arr.length; index++)
    {
        Stack curStack = arr[index];
        boolean foundChild = false;
        //a stack with a size > 1 means we have a parent and then we check if it's the parent we want
        if(curStack != null && curStack.size() > 1 && curStack.peek().equals(parentName))
        {
            curStack.pop(); //remove the parents name from the stack
            //search the parent stack for the child's name
            while(!(foundChild = curStack.peek().equals(childName)) && curStack.size() > 0)
            {
                curStack.pop(); //remove the name
            }
        }

        if(foundChild)
        {
            System.out.println(parentName + " has the child named " + childName);
        }
    }