请检查代码
package com.gmail.practice;
import java.util.Arrays;
public class StacksForTwo {
int size;
int[] stack;
int top1;
int top2;
public StacksForTwo(int arraysize)
{
size = arraysize;
stack = new int[size];
top1 = -1;
top2 = size;
}
public void push1(int x)
{
if(top1 < top2-1)
{
top1++;
stack[top1] = x;
}else{
System.out.println("stackoverflow");
}
}
public void push2(int y)
{
if(top1 < top2-1)
{
top2--;
stack[top2] = y;
}else{
System.out.println("stack overflow");
}
}
public void pop1()
{
if(top1 >= 0)
{
top1--;
System.out.println("The popped out number is"+" "+stack[top1+1]);
}else{
System.out.println("stack underflow");
}
}
public void pop2()
{
if(top2 < size)
{
top2++;
System.out.println("The popped out number is"+" "+stack[top2+1]);
}else{
System.out.println("stack underflow");
}
}
public void display()
{
System.out.println(Arrays.toString(stack));
}
public static void main(String[] args)
{
StacksForTwo sft = new StacksForTwo(10);
sft.push1(4);
sft.push1(5);
sft.push1(3);
sft.push1(2);
sft.push2(6);
sft.push2(4);
sft.display();
sft.push2(8);
sft.push1(2);
sft.push2(6);
sft.push2(4);
sft.push2(8);
sft.display();
}
}发布于 2015-10-05 14:01:20
我会去
interface Stack {
boolean isEmpty();
int pop();
void push(int x);
}然后创建一个提供两个堆栈的类。
还创建一个计数器来检测两个堆栈何时已满。这可以通过计算空闲数组插槽的AtomicInteger (线程安全性)来完成。
public class StackPair {
public final Stack firstStack = new Stack { ... };
public final Stack secondStack = new Stack { ... };
public StackPair(int capacity) { ... }在StackPair中,单个数组和一个AtomicInteger freeEntries。在这两个堆栈实现中,访问数组和freeEntries。
发布于 2015-10-05 11:12:56
这段代码是只写堆栈内存的WOM实现.一般都是开玩笑的。从堆栈中获取数据的唯一方法是解析标准输出,等待包含值的println语句。
我可以理解,您的代码在这里让您监视过程的发生,但除此之外,这里没有多少真正的功能。我鼓励您使用正确的代码,其中pop()方法实际上返回其结果,而调用代码是打印输出的代码。或者,我强烈建议您使用IDE的调试器接口来执行您的代码,这样您就可以看到事情是这样发生的。
话虽如此,以下是一些一般性意见:
size和stack变量也应该是最终变量。display()方法,只需重写toString()push1和pop1 et都可能应该重命名为pushLeft和pushRight,或者实际上除了1和2以外的任何东西。您使用了变量x和y,那么为什么pushX和pushY没有呢?发布于 2019-03-24 09:35:54
你不符合你的支撑和缩进的风格。如果有疑问,选择一个自动格式化程序并使用它。大多数的IDE都有一个,只是用它作为开头。
public class StacksForTwo这对全班来说是个坏名声。“对”是一个更好的词。
int size;
int[] stack;
int top1;
int top2;为什么这些变量包是私有的?
public StacksForTwo(int arraysize)arraysize是这个变量的不正确名称,size将是正确的,因为正在使用的数组只是实现细节,不应该通过API显示。
public StacksForTwo(int size) {
this.size = size;
...此外,应该明确指出,大小是所有项目的大小。
public void push1(int x)x是这个变量的坏名字,它应该是item或value。
System.out.println("stackoverflow");在这种情况下,最好抛出一个异常。
public void pop1()
...
System.out.println("The popped out number is"+" "+stack[top1+1]);此方法应返回弹出式数字,并将打印留给外部代码。
top1--;
System.out.println("The popped out number is"+" "+stack[top1+1]);为了更容易阅读,您可以将其滚动到一个操作中:
return stack[top1--];System.out.println("stack underflow");这也应该是一个例外。
public void display()
{
System.out.println(Arrays.toString(stack));
}这应该是重写的toString方法。
public static void main(String[] args)理想情况下,您的主要类是另一个类。
StacksForTwo sft = new StacksForTwo(10);请不要喜欢名字,总是选择愚蠢和简单的名字,如stacksForTwo或stacks。在1000+行方法中,必须将缩短的名称和/或缩略词作为名称来处理,这是一个噩梦,您不想找到自己,因为您必须不断地将名称映射到对您有意义的事情上。
https://codereview.stackexchange.com/questions/106598
复制相似问题