簡體   English   中英

帶堆棧的配電箱路由(Java語言)

[英]Switchbox routing with stack (java language)

我一直在從事有關Java中堆棧的大學作業,但似乎找不到該作業的幫助。 這是關於配電箱路由的,我需要使用堆棧進行此分配。 作業定於明天到期,但由於我只在尋找解決方案,而不是成績,因此無需着急回答。 由於問題不是用英語寫的,所以我將給出簡短的解釋。

配電箱包含4n針,配電箱的每一側都有n針。 僅當連接一對引腳的線中的任何一條都不相交時,開關盒才可布線。 輸入將是成對的連接引腳號。

我發現了一些可能的解決方案,但無法理解:1.該問題可以通過與括號匹配的算法類似的算法來解決。2.將引腳號放入堆棧和數組中並進行比較(這是最令人困惑的一個)

到目前為止,我的代碼(嘗試第二種算法):

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());
                }
            }
        }
    }

}

在您的add方法中, else塊是錯誤的。 我無法理解您想做什么,但您需要做下一件事

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堆棧即可。 如果為空,則一切正常。 否則有相交的線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM