Несколько скобок с использованием стека - PullRequest
0 голосов
/ 14 марта 2019

Последовательность скобок называется «сбалансированной», если каждому открывающему символу соответствует закрывающий символ. символ и пары скобок правильно вложены. Например, (() (())) является сбалансированным и (())) () не является. Несколько круглых скобок - это та же концепция, за исключением того, что круглые скобки имеют типы и каждый открытый Символ имеет соответствующий символ закрытия того же типа. Например, (0 (1) 1 (2 (0) 0) 2) 0 сбалансировано, в то время как (0 (1) 1 (2 (3) 2) 2) 0 и (2 (0) 2) 2 не сбалансированы. Мы предполагаем последовательность из нескольких скобок, образованную n Символ представлен двумя массивами: массивом p целых чисел и массивом логических значений b, где p [i] обозначает тип i-го символа и b [i] указывают, является ли i-й символ открытым (ложным) или близким символом (правда). Например, для (2 (0) 2) 2 p включает [2, 0, 2, 2], а b включает [false, false, true, true].
Это вопрос, предоставленный мне. Моя реализация компилируется нормально, но она не дает мне ожидаемого результата, и я не могу понять, почему. Я реализовал стек вручную, так как это тоже требование.

public class Stack
{
protected char[] symb;
protected int[] number;
protected int index;
protected int size;

public Stack(int newSize)
{
    size = newSize;
    symb = new char[size];
    number = new int[size];
    index = 0;
}

public void push (char parnth, int num )
{
    if (index < size)
    {
        symb[index++] = parnth;
        number[index++]=num;
    }

}

public boolean isEmpty()
{
    return (index==0);
}

public char topSymb ()
{
    char topItem='\0';
    if (! isEmpty () )
    {
        topItem = symb [index -1];
    }
    return topItem ;
}

public int topNum()
{
    int topItem = 0;
    if(!isEmpty())
    {
        topItem = number[index-1];
    }
    return topItem;
}

public char popSymb () {
    char topItem = topSymb () ;
    if (! isEmpty () )
    {
        index --;
    }
    return topItem ;
}

public int popNum ()
{
    int topItem = topNum();
    if(!isEmpty())
    {
        index--;
    }
    return topItem;
}
}  



public class Parenthesis
{
private static final char OPEN = '(';
private static final char CLOSE = ')';

public static boolean isPair(char char1, char char2, int num1, int num2)
{
    if(char1 == OPEN && char2 == CLOSE && num1 == num2)
    {
        return true;
    }
    return false;
}

public static boolean checkBalanced(int[] p, boolean[] b)
{
    Stack storage = new Stack(b.length);

    for(int i=0; i<p.length; i++)
    {
        if(b[i]==false)
        {
           char o=OPEN;
           int numO=p[i];
           storage.push(o, numO);
        }
        else if(b[i]==true)
        {
            char c=CLOSE;
            int numC=p[i];
            if (storage.isEmpty() || 
!isPair(c,storage.popSymb(),storage.popNum(),numC))
            {
                return false;
            }
        }
    }
    return true;
}
}
...