我们的老师要求我们创建一个程序,根据LIFO的原理复制堆栈的工作,并指出堆栈溢出和空堆栈。
我创建了三个类。包含main方法的Retrievee类,它使用String [] args从用户获取输入。其他类Push使用Retrievee类中的值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
然后我尝试了这个代码,但只是在包含main方法的单个类中。
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];
答案 0 :(得分:0)
你在这里问了不止一个问题,但是......
cannot find symbol
是编译器告诉您对浮动的某个变量有未定义引用的方式。它甚至会告诉你它们是哪些变量。所以,现在,您没有将a
或push
定义为任何内容。声明并将它们实例化为适当的值。
您不需要设置args[]
的大小,因为它基本上是无限的。在命令行上传递参数时使用args[]
:
java program1 param1 param2 param3 param4 ... param99
...这些参数中的每一个都在args
。
你可以为main
写这个,这意味着同样的事情:
public static void main(String... args) { }
以上称为varargs
。我建议你研究一下这个参考。