[错误]表达式的类型必须是数组类型,但它已解析为Stack

时间:2014-10-22 18:28:57

标签: java arraylist stack depth-first-search

我是Java的初学者,我需要使用它的arraylists打印图表的DFS来存储邻接列表。当我尝试编译时,我收到以下错误:

Type mismatch: cannot convert from Object to Integer
The type of the expression must be an array type but it resolved to Stack
The type of the expression must be an array type but it resolved to Stack

代码如下:

package principal;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static void main(String []arg)
    {
        ArrayList<List<Integer>>L=new ArrayList<List<Integer>>();
        ArrayList<Integer>l=new ArrayList<Integer>();
        int nod;
        Scanner sc = null;

        try {
            sc=new Scanner(new File("Graph.txt"));
            while (sc.hasNextInt())
            {
                do
                {
                    nod=sc.nextInt();
                    if(nod!=0) l.add(nod);
                }while(nod!=0);
                L.add((List<Integer>) l.clone());
                l.clear();
            }

            Stack stack = new Stack();
            Stack viz = new Stack();
            System.out.println("Root: ");
            Integer root = sc.nextInt();
            stack.push(root);
            while (!stack.isEmpty())
                {
                    Integer node = stack.pop();
                    System.out.print(node + " ");
                    viz[node]=1;
                    for (Integer child : L.get(node))
                    {
                        if(viz[child]!=1)
                            {
                                stack.push(child);
                            }
                    }
                }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        finally{sc.close();}
    }

}

Graph.txt包含以下内容

2 3 4
1 3 4
1 2 4
1 2 3

3 个答案:

答案 0 :(得分:0)

您无法对堆栈使用数组语法(array[index]),您必须使用push()pop()peek()

Stacks以先进先出的方式工作。因此,堆栈中唯一可访问的元素是最重要的元素。使用pop()时,删除顶部项目以便可以访问下一个项目。 push()用于在顶部放置一个值,peek()用于检查顶部项目而不会弹出它。

如果我有以下堆栈

Sam
Dan
Adam

使用pop(),将返回“Sam”并将其从堆栈中删除,因此它将如下所示。

Dan
Adam

推出“查理”将使这个堆栈看起来像这样。

Charlie
Dan
Adam

我必须弹出两次才能访问“Adam”

答案 1 :(得分:0)

viz是一个堆栈,而不是一个数组。您无法在其上使用数组表示法 - viz[node]

Integer node = stack.pop(); 

这也是一个错误,因为您的Stack不是通用的,因此您必须将pop()的结果转换为Integer

Integer node = (Integer) stack.pop();

另一种方法是更改​​堆栈类型:

Stack<Integer> stack = new Stack<Integer>();

答案 2 :(得分:0)

<强>第一

  

类型不匹配:无法从Object转换为Integer

stack.pop()会返回Object引用,您需要输入转换为Integer

// Type caste or define stack as Stack<Integer>
Integer node = (Integer) stack.pop(); 

<强>第二

  

表达式的类型必须是数组类型,但它已解析为Stack

viz[node]=1; // viz is Stack, define it as array