-1

我们的老师要求我们创建一个程序,该程序将根据 LIFO 原理复制堆栈的工作,并指示堆栈溢出和空堆栈。

我创建了三个类。Retrievee 类包含 main 方法,该方法使用 String[] 参数从用户那里获取输入。其他类 Push 使用 Retrievee 中的值 类 Push 应根据其大小接受值,并检查值是否超过其大小,并声明溢出并继续到使用 Class push 中的值而不是检索的类 Pop。

class Push extends Retrivee
{
  int i;
  Push()
  {
    String push[]= new String[10];
    //int push[]=new int[10];
    for(i=0;i<12;i++)
    {
      //Retrivee ele= new Retrivee();
      push[i]=a[i];
      System.out.print("value in Push["+i+"]="+push[i]);
      if( i == 9 )
         {
           System.out.print("Stack for push has Overflown");
         }
    }
  }
}

class Pop extends Push
{
  int i;
  Pop()
  {
    String pop[]= new String[10];
    //int pop[]= new int[10];
    for(i=10;i>=-1;i--)
    {
      //Push ele1= new Push();
      pop[i]=push[i];
      System.out.print("value in Pop["+i+"]="+pop[i]);
      if(i == -1)
      {
       System.out.print("Stack for pop is empty");
      }
    }
  }
}
public class Retrivee
{
    public static void main(String args[] )
    {
        System.out.println("please enter 12 elements");
        String a[] = new String[13];
        //int a[]=new int [13];
        a[1]=args[1];
        a[2]=args[2];
        a[3]=args[3];
        a[4]=args[4];
        a[5]=args[5];
        a[6]=args[6];
        a[7]=args[7];
        a[8]=args[8];
        a[9]=args[9];
        a[10]=args[10];
        a[11]=args[11];

    /*
        a[0]=Integer.parseInt (args[0]);
        a[1]=Integer.parseInt (args[1]);
        a[2]=Integer.parseInt (args[2]);
        a[3]=Integer.parseInt (args[3]);
        a[4]=Integer.parseInt (args[4]);
        a[5]=Integer.parseInt (args[5]);
        a[6]=Integer.parseInt (args[6]);
        a[7]=Integer.parseInt (args[7]);
        a[8]=Integer.parseInt (args[8]);
        a[9]=Integer.parseInt (args[9]);
        a[10]=Integer.parseInt (args[10]);
        a[11]=Integer.parseInt (args[11]);
     */

     /* Push push1 =new Push();
        Pop pop1 =new Pop();

     */
    }
}

在编译时我得到了错误

 Retrivee.java:11:error :cannot find symbol
    push[i]=a[i];
    symbol: variable a
    location:class Push
 Retrivee.java:31:error :cannot find symbol
    pop[i]=push[i];
    symbol: variable push
    location:class Pop

所以我最后想也许从 String[] args 中获取的值不能传递给另一个类。所以稍微改进了代码。

class Push //extends Retrive
{
    public Push()
    {
        int i;
        String push[]= new String[10];
        //Retrive ele= new Retrive();
        try
        {
            for(i=0;i<13;i++)
            {
                push[i]=Retrive.a[i];
                System.out.println("value in Push["+i+"]="+push[i]);
            }
        }
        catch(Exception e)
        {
            System.out.println("Stack for push has Overflown");
        }
    }
}

class Pop //extends Push
{
    public Pop()
    {
        int j;
        String pop[]= new String[10];
        //Push ele1= new Push();
        try
        {
            for(j=9;j>=-1;j--)
            {
                pop[j]=Pop.push[j];
                System.out.println("value in Pop["+j+"]="+pop[j]);
            }
        }
        catch(Exception ev)
        {
            System.out.println("Stack for pop is empty");
        }
    }
}

public class Retrive 
{
    public static void main(String args[])
    {
        String a[] = new String[13];
        for(int k=0;k<13;k++)
        {
            int d[]=new int[13];
            d[k]=2*k;
            a[k]=Integer.toString(d[k]);
            System.out.println("a["+k+"]= "+a[k]);
        }
    }
}

但再次以同样的错误结束

 Retrive.java:12:error :cannot find symbol
    push[i]=Retrive.a[i];
    symbol: variable a
    location:class Retrive
 Retrive.java:34:error :cannot find symbol
    pop[i]=Pop.push[i];
    symbol: variable push
    location:class Pop

然后我尝试了这段代码,但只是在包含主要方法的单个类中。

public class Retrivee
{
    public static void main(String args[] )
    {
        String a[] = new String[13];
        for(int k=0;k<13;k++)
        {
            int d[]=new int[13];
            d[k]=2*k;
            a[k]=Integer.toString(d[k]);
            System.out.println("a["+k+"]= "+a[k]);
        }
        int i;
        String push[]= new String[10];
        try
        {
            for(i=0;i<13;i++)
            {
                push[i]=a[i];
                System.out.println("value in Push["+i+"]="+push[i]);
            }
        }
        catch(Exception e)
        {
            System.out.println("Stack for push has Overflown");
        }
        int j;
        String pop[]= new String[10];
        try
        {
            for(j=9;j>=-1;j--)
            {
                pop[j]=push[j];
                System.out.println("value in Pop["+j+"]="+pop[j]);
            }
        }
        catch(Exception ev)
        {
            System.out.println("Stack for pop is empty");
        }
    }
}

最后它起作用了。为什么在上述两种情况下都不起作用?如果它可以工作,请说明应该如何以及在哪里进行更改。

我想问的最后一件事是为什么我们不能像这样在 main 方法中设置 String args[] 的大小

  public static void main(String args[] = new String[10]) 
  {
  }

在第一个例子之后我写了一个小代码

import java.util.*;
public class MyScan 
{
    public static void main(String[] args) 
    {
        //String[] args = new String[10];
        String[] in = new String[4];//= {"1 a 10 . 100 1000","12","2112"};
        in[0]= "1"; //args[0];
        in[1]= "2"; //args[1];
        in[2]= "3"; //args[2];
        String accum;
        for(int x = 0; x <3; x++)   
        {
            Scanner s = new Scanner(in[x]);
            accum = s.nextLine();
            System.out.println(accum);
        }
    }
} 

当我写

 in[0]= args[0];
 in[1]= args[1];
 in[2]= args[2];

它扔了

  Exception in thread"main" java.lang.ArrayIndexOutOfBoundsException:0
  at MyScan.main<MyScan.java:9>

但是上面的初始化在另一个程序中使用时有效,但方式有所不同。

    String a= args[0];
    String b= args[1];
4

1 回答 1

0

你在这里问了不止一个问题,但是...

cannot find symbol是编译器告诉您您对浮动的某些变量有未定义引用的方式。它甚至会告诉你它们是哪些变量。所以,现在,你没有a或没有push定义任何东西。声明它们并将它们实例化为适当的值。

您不需要设置 的大小args[],因为它本质上是无限的。 args[]在命令行传入参数时使用:

java program1 param1 param2 param3 param4 ... param99

...并且这些参数中的每一个都将在args.

你可以写这个main,它的意思是一样的:

public static void main(String... args) { }

以上称为varargs. 我建议您查看该参考资料。

于 2013-02-24T22:00:09.883 回答