首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用堆栈的交换机路由(java语言)

使用堆栈的交换机路由(java语言)
EN

Stack Overflow用户
提问于 2015-04-18 15:52:37
回答 1查看 783关注 0票数 1

我一直在做我的大学作业,关于java中的栈,但是我似乎找不到这个作业的帮助。这是关于switchbox routing的,我需要使用stack来完成这个任务。作业明天就要交了,但是没有必要急于寻找答案,因为我只是在寻找答案,而不是成绩。因为这个问题不是用英语写的,所以我将给出简短的解释。

开关盒包含4n个针脚,盒的两边各有n个针脚。仅当连接一对端号的线路中没有一条与另一对端号相交时,开关盒才可布线。输入将是成对连接的引脚编号。

我找到了一些可能的解决方案,但无法理解: 1.问题可以用类似于圆括号匹配的算法来解决2.将引脚编号放入堆栈和数组中并进行比较(这是最令人困惑的一个)

到目前为止我的代码(尝试第二种算法):

代码语言:javascript
复制
import java.util.Scanner;
import java.util.Stack;
public class Tester {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int cases=sc.nextInt();
        for(int i=0;i<cases;i++){            
            int pin=sc.nextInt();
            SwitchBox box=new SwitchBox(pin);
            for(int j=0;j<pin*4;j++){
                box.add(sc.nextInt());
            }            
            boolean res=box.isRoutable();
            if(res){
                System.out.println("routable");
            }
            else{
                System.out.println("not routable");
            }
        }
    }
    static class SwitchBox{
        Stack<Integer> pins;
        int[] pairs;
        int[] comparator;
        public SwitchBox(int pin){            
            this.pins=new Stack<Integer>();
            this.pairs=new int[(pin*4)];
            this.comparator=new int[this.pairs.length];
        }
        public boolean isRoutable(){
            Stack<Integer> s=new Stack<Integer>();
            for(int i=0;i<pairs.length;i++){
                pairs[i]=pins.peek();
                s.push(pins.pop());
            }
            for(int i=pairs.length-1;i>=0;i--){
                if(pairs[i]!=s.pop()){
                    return true;
                }
            }
            return false;
        }
        public void add(int pinNum){
            if(pins.isEmpty()){
                pins.push(pinNum);
            }
            else{
                Stack<Integer> temp=new Stack<Integer>();
                int top=(int)pins.peek();
                while(top>pinNum){
                    temp.push(pins.pop());
                    if(pins.isEmpty()) top=pinNum;
                    else top=(int)pins.peek();
                }
                pins.push(pinNum);
                while(!temp.isEmpty()){
                    pins.push(temp.pop());
                }
            }
        }
    }

}
EN

回答 1

Stack Overflow用户

发布于 2015-04-18 16:14:09

在您的add方法中,else块是错误的。我不能理解你想做什么,但你需要做下一件事

代码语言:javascript
复制
public void add(int pinNum) {
    if (pins.isEmpty()) {
        pins.push(pinNum);
    } else {
        Integer last = pins.peek();
        if (last == pinNum) {
            pins.pop();
        } else {
            pins.push(pinNum);
        }
    }
}

在此之后,isRoutable方法只需要检查pins堆栈。如果它是空的,那么一切都好。否则就会有相交的线。

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

https://stackoverflow.com/questions/29714545

复制
相关文章

相似问题

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