首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中使用单个数组实现两个堆栈

在java中使用单个数组实现两个堆栈
EN

Code Review用户
提问于 2015-10-05 09:13:53
回答 3查看 1.9K关注 0票数 5

请检查代码

代码语言:javascript
复制
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();
    }
}
EN

回答 3

Code Review用户

回答已采纳

发布于 2015-10-05 14:01:20

我会去

代码语言:javascript
复制
interface Stack {
    boolean isEmpty();
    int pop();
    void push(int x);
}

然后创建一个提供两个堆栈的类。

还创建一个计数器来检测两个堆栈何时已满。这可以通过计算空闲数组插槽的AtomicInteger (线程安全性)来完成。

代码语言:javascript
复制
public class StackPair {
    public final Stack firstStack = new Stack { ... };
    public final Stack secondStack = new Stack { ... };
    public StackPair(int capacity) { ... }

在StackPair中,单个数组和一个AtomicInteger freeEntries。在这两个堆栈实现中,访问数组和freeEntries。

票数 7
EN

Code Review用户

发布于 2015-10-05 11:12:56

这段代码是只写堆栈内存的WOM实现.一般都是开玩笑的。从堆栈中获取数据的唯一方法是解析标准输出,等待包含值的println语句。

我可以理解,您的代码在这里让您监视过程的发生,但除此之外,这里没有多少真正的功能。我鼓励您使用正确的代码,其中pop()方法实际上返回其结果,而调用代码是打印输出的代码。或者,我强烈建议您使用IDE的调试器接口来执行您的代码,这样您就可以看到事情是这样发生的。

话虽如此,以下是一些一般性意见:

  1. 您的实例变量不是私有的,应该是。
  2. sizestack变量也应该是最终变量。
  3. 而不是有一个display()方法,只需重写toString()
  4. push1pop1 et都可能应该重命名为pushLeftpushRight,或者实际上除了1和2以外的任何东西。您使用了变量xy,那么为什么pushXpushY没有呢?
票数 6
EN

Code Review用户

发布于 2019-03-24 09:35:54

你不符合你的支撑和缩进的风格。如果有疑问,选择一个自动格式化程序并使用它。大多数的IDE都有一个,只是用它作为开头。

代码语言:javascript
复制
public class StacksForTwo

这对全班来说是个坏名声。“对”是一个更好的词。

代码语言:javascript
复制
int size;
int[] stack;
int top1;
int top2;

为什么这些变量包是私有的?

代码语言:javascript
复制
public StacksForTwo(int arraysize)

arraysize是这个变量的不正确名称,size将是正确的,因为正在使用的数组只是实现细节,不应该通过API显示。

代码语言:javascript
复制
public StacksForTwo(int size) {
    this.size = size;
    ...

此外,应该明确指出,大小是所有项目的大小。

代码语言:javascript
复制
public void push1(int x)

x是这个变量的坏名字,它应该是itemvalue

代码语言:javascript
复制
System.out.println("stackoverflow");

在这种情况下,最好抛出一个异常。

代码语言:javascript
复制
public void pop1()
...
    System.out.println("The popped out number is"+" "+stack[top1+1]);

此方法应返回弹出式数字,并将打印留给外部代码。

代码语言:javascript
复制
top1--;
System.out.println("The popped out number is"+" "+stack[top1+1]);

为了更容易阅读,您可以将其滚动到一个操作中:

代码语言:javascript
复制
return stack[top1--];
代码语言:javascript
复制
System.out.println("stack underflow");

这也应该是一个例外。

代码语言:javascript
复制
public void display()
{
    System.out.println(Arrays.toString(stack));
}

这应该是重写的toString方法。

代码语言:javascript
复制
public static void main(String[] args)

理想情况下,您的主要类是另一个类。

代码语言:javascript
复制
StacksForTwo sft = new StacksForTwo(10);

请不要喜欢名字,总是选择愚蠢和简单的名字,如stacksForTwostacks。在1000+行方法中,必须将缩短的名称和/或缩略词作为名称来处理,这是一个噩梦,您不想找到自己,因为您必须不断地将名称映射到对您有意义的事情上。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/106598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档