堆栈被覆盖了

时间:2015-04-10 10:01:22

标签: java stack

我正在编写一个创建节点树的程序,并在dfs上找到它(尚未完成),但是当我尝试将新节点推送到类时,我遇到了问题。新节点用我的方法覆盖旧节点。 Node类声明为

public class Node {
    int[][] matrix;
    Node pre;
    boolean visited;
}

和类dfs是这样的:(仅缺少代码有bug)

import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;

public class DFS {
    private static Stack<Node> stack;
    public DFS()
    {
        stack = new Stack<Node>();
    }
    public static int dfs(int matrix[][])
    {
        Node first = new Node();
        first.matrix= matrix;
        first.visited=true;
        first.pre= null;
        stack.push(first);
        pushleft(stack.peek());
        pushleft(stack.peek());
        return 0;

    }
    public static void pushleft(Node Nodeleft)
    {
        Node Newnode= new Node();
        Newnode.matrix = left(Nodeleft.matrix);
        stack.push(Newnode);
    }
    public static int[][] left (int matrix[][]) {
    int matrix1[][]= new int[4][4];
    for(int i=0; i<=3;i++)
        for (int j=3;j>=0;j--)
        {
            if (matrix[i][j] !=0) 
            {
                for (int k=j; k>=0; k--)
                    if (matrix[i][k]==0)
                    {       
                        for (int l=k; l<=2;l++) 
                            matrix1[i][l]=matrix[i][l+1];    
                        matrix1[i][3]=0;
                    }
                break;
            }

        }

    for(int i=0; i<=3;i++)
        for (int j=0;j<=2;j++)
        {

            if (matrix[i][j]==matrix[i][j+1])  
            {
                matrix1[i][j]=matrix[i][j]*2;
                for (int l=j+1; l<=2;l++) 
                    matrix1[i][l]=matrix[i][l+1];    
                matrix1[i][3]=0;             
            }

        }
    return matrix1;
}
    public static void main(String[] args) 
    {
        stack = new Stack<Node>();
        int a[][]=new int[4][4];
        int goal;
        Scanner in = new Scanner(System.in);
        System.out.println("input 4x4");
        for(int i=0; i<=3;i++)
            for (int j=0;j<=3;j++)
            {
                a[i][j]=in.nextInt();
            }
        if (dfs(a)==0)
        {
            System.out.println("Win");
            System.out.println("Cac trang thai:");
        while (!stack.isEmpty())
        {
        for(int i=0; i<=3;i++)
        {
            for (int j=0;j<=3;j++)
            {               
                System.out.print(stack.peek().matrix[i][j]+ " ");
            }
            System.out.println("");
        }
        System.out.println("");
        stack.pop();
        }

        in.close();
        }

    }
    }

当我试图把这个阵列发光时

0 0 0 0
2 2 2 2
0 0 0 2
2 2 4 4
I want my output like this:<br/>
0 0 0 0 
8 0 0 0 
2 0 0 0 
4 8 0 0 

0 0 0 0 
4 4 0 0 
2 0 0 0 
4 8 0 0 

0 0 0 0
2 2 2 2
0 0 0 2
2 2 4 4

但它只打印了3次:

0 0 0 0 
8 0 0 0 
2 0 0 0 
4 8 0 0 

我想我的方法pushleft遇到了静电等问题,但仍无法解决问题。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

在您致电Matrix时,您需要在每次新pushleft时创建。

您遇到了问题,因为所有Matrix Arrays都指向同一个object。 因此,如果您在一个matrix中更改了任何内容,那么其他matrix的所有Node object也会发生变化。

创建新的Matrix数组,并从old matrix array分配值。

as

 public static int[][] left (int matrix[][]) {
        int matrix2[][] = new int[4][4];
        // assign all the values as you want
        // your code...

       return matrix2;
   }