Сравнение стека псевдокодов - PullRequest
0 голосов
/ 27 февраля 2019

Мне нужно проверить две очереди (a и b), чтобы увидеть, идентичны они или нет (одинаковые элементы в одинаковом порядке).И в конце обе очереди должны выглядеть так же, как и начало.Только используя push, pop, top и EmptyStack.

Это то, что у меня есть, но для меня это не имеет смысла.

boolean ABSimilar(A,B){
    if (A.EmptyStack() != B.EmptyStack()) return false; // stacks same
    if (A.EmptyStack() && B.EmptyStack()) return true; // stacks are the same
    A_element = A.pop(); // grab elements
    B_element = B.pop();
    if A_element == null && B_element != null {
      A.push(A_element); // if !=, restore them and return false
      B.push(B_element);
      return false;
    }
    answer = ABASimilar(A, B); // compare
    A.push(A_element);  // restore
    B.push(B_element);
    return answer; // return answer
}

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

У вас есть небольшая проблема с вашим кодом.Попробуйте так:

boolean isABSimilar(A,B){
    if (A.isEmptyStack() && B.isEmptyStack()) return true; // stacks are the same

    if (A.isEmptyStack()) return false;  // stacks are different
    if (B.isEmptyStack()) return false;
    if (A.top() != B.top()) return false;

    A_element = A.pop(); // grab elements
    B_element = B.pop();

    answer = isABASimilar(A, B); // ckech remaining stack

    A.push(A_element);  // restore
    B.push(B_element);

    return answer; // return answer
}

Обратите внимание, что рекурсивный метод, подобный приведенному выше, должен использоваться только тогда, когда вы знаете, что размер стеков довольно мал.

Также обратите внимание, что приведенный выше «код» не может быть скомпилирован как код C по ряду причин.Пример:

  1. boolean isABSimilar(A,B) не является действительным прототипом функции

  2. A_element, а B_element и answer не определены

Вы должны исправить это перед компиляцией.

В C нет встроенного типа стека, поэтому я предполагаю, что это пользовательский тип в вашем коде.Что-то вроде:

struct Stack
{
    ... Member function pointers
    ... Member data
};

В этом случае ваша функция должна выглядеть следующим образом:

int isABSimilar(struct Stack A, struct Stack B){
    int answer;
    int A_element;  // I just assume that data type is int
    int B_element;  // but it can be other types (OP never told us)

    ... the code from above
0 голосов
/ 27 февраля 2019

Ваша логика почти верна.

То, чего вам не хватает, - это правильное сравнение удаляемого элемента из A с удаляемым элементом из B.

Вы проверяете толькоявляется ли A_element нулевым, а B_element - нет, и в этом случае возвращает false.

Вам также следует вернуть false, если A_element не равен NULL и B_element равен NULL, или если они оба не равны NULL, но не равны каждомуother.

Только если они равны друг другу (либо null, либо оба не null и не равны), вы должны сделать рекурсивный вызов, который сравнил бы остальные стеки.

boolean isABSimilar(A,B){
    if (A.isEmptyStack() != B.isEmptyStack()) 
        return false; // stacks same
    if (A.isEmptyStack() && B.isEmptyStack()) 
        return true; // stacks are the same
    A_element = A.pop(); // grab elements
    B_element = B.pop();
    if ((A_element == null && B_element != null) || (A_element != null && !A_element.equals(B_element))) {
        A.push(A_element); // if !=, restore them and return false
        B.push(B_element);
        return false;
    }
    answer = isABASimilar(A, B); // compare
    A.push(A_element);  // restore
    B.push(B_element);
    return answer; // return answer
}
...