Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.Stack;
- class Zagrada {
- private char z;
- private int pozicija;
- public Zagrada(char z, int pozicija){
- this.z = z;
- this.pozicija = pozicija;
- }
- public String toString(){
- return z + ": " + pozicija;
- }
- public char getZagrada(){
- return z;
- }
- }
- class NepravilneZagrade extends Exception{
- private Zagrada z;
- public NepravilneZagrade(String poruka, Zagrada z){
- super(poruka);
- this.z = z;
- }
- public Zagrada getZagrada(){
- return z;
- }
- }
- class OtvorenaViseca extends NepravilneZagrade{
- public OtvorenaViseca(Zagrada z){
- super("Otvorena " + z + " nema zatvorenu", z);
- }
- }
- class ZatvorenaViseca extends NepravilneZagrade{
- public ZatvorenaViseca(Zagrada z){
- super("Zatvorena " + z + " bez otvorene", z);
- }
- }
- class ZatvorenaPogresna extends NepravilneZagrade {
- public ZatvorenaPogresna(Zagrada otvorena, Zagrada zatvorena){
- super("Otvorena " + otvorena + " zatvorena sa " + zatvorena, otvorena);
- }
- }
- public class BracketPrettyPrinter {
- public static boolean kompatibilna (char z1, char z2){
- if (z1 == '{') return z2 == '}';
- else if (z1 == '[') return z2 == ']';
- else return z2 == ')';
- }
- private static StringBuilder uvuci(int level) {
- StringBuilder sb = new StringBuilder();
- sb.append('\n');
- for (int i = 0; i< level; i++){
- sb.append(" ");
- }
- return sb;
- }
- public static String format(String ulaz) throws NepravilneZagrade {
- Stack<Zagrada> stek = new Stack<Zagrada>();
- StringBuilder sb = new StringBuilder();
- int level = 0;
- for(int i = 0; i < ulaz.length();i++){
- char c = ulaz.charAt(i);
- if (c == '(' || c == '[' || c == '{'){
- stek.push(new Zagrada(c,i));
- ++level;
- sb.append(uvuci(level));
- } else if (c == ')' || c == ']' || c == '}') {
- if (stek.empty())
- throw new ZatvorenaViseca(new Zagrada(c,i));
- Zagrada poslednjaOtvorena = stek.pop();
- if (!kompatibilna(poslednjaOtvorena.getZagrada(), c))
- throw new ZatvorenaPogresna(poslednjaOtvorena, new Zagrada(c,i));
- level--;
- } else {
- sb.append(c);
- }
- } // end for petlje
- if (!stek.empty()){
- throw new OtvorenaViseca(stek.pop());
- }
- return sb.toString();
- }
- public static void main(String[] args) {
- String[] slucajevi = {
- "if [<= n 1] {1} (* {n} faktorijel (-n 1)))",
- "Neke([] { } zagrade )] )))",
- "Ot ((( nema zatvorene",
- "Zdravko{Zdr(av)ko[dren]]"
- };
- int brZatvorenaPogresna = 0, brViseca = 0, ok = 0;
- for (int i = 0; i < slucajevi.length; i++){
- try {
- System.out.println(BracketPrettyPrinter.format(slucajevi[i]));
- ok++;
- } catch(NepravilneZagrade e){
- System.err.println(e.getLocalizedMessage());
- if (e instanceof ZatvorenaPogresna)
- brZatvorenaPogresna++;
- else
- brViseca++;
- }
- } // kraj for petlje
- System.out.println("\nProsle test primera: " + ok);
- System.out.println("Zatvoreno pogresnih: " + brZatvorenaPogresna);
- System.out.println("Visećih: " + brViseca);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement