我们的老师要求我们创建一个程序,该程序将根据 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];