Нужна помощь по использованию сортировки в моей программе - PullRequest
0 голосов
/ 24 января 2011

У меня есть простая программа, которая перечисляет входные данные в порядке приоритета, проверяя только операторы и ранжируя их следующим образом: "* / + -":

#include <iostream>
#include <stack>
#include <string>


using namespace std;

int prec(char op)
{
    if (op == '*' || op == '/') return 0;
    return 1;
}

bool compareprec(char a, char b)
{
    return prec(a) < prec(b);

}

int main()
{
    char input[] = "+-/*";
    cin >> input;
    sort(input, input + 4, &compareprec);
    cout << input;
}

Я пытаюсь реализовать его в более сложной программе, которая использует стеки для проверки буквенно-цифрового ввода и выполнения преобразования из инфикса в постфикс, ранжируя что-то вроде этого: «9 * 9 + 9» в «9 9 9» * + ". Более сложная программа выглядит следующим образом:

#include <iostream>
#include <stack>
#include <string>


using namespace std;

int prec(char op)
{
    if (op == '*' || op == '/' || op == '+' || op == '-') return 0;
    return 1;
}

bool compareprec(char a, char b)
{
    return prec(a) < prec(b);

}

int main()
{
    stack<char> s;
    char input;
    while (cin.get(input) && input != '\n')
        {
            if (isalnum(input))
                cout << input << " ";
            else if (input == '(')
                s.push(input);
            else if (input == ')')
            {
     while (!s.empty() && s.top() != '(')
         {
      cout << s.top() << " ";
      s.pop();
  }
         if(!s.empty()) 
                    s.pop();
         else
                cout << "ERROR: No Matching ( \n";
     }
  else if (s.empty() && input == '*'|| input == '/'|| input == '+'|| input == '-') 
  {
             sort(input, input + 4, &compareprec); // Error Begins Here?
             s.push(input);
  }
         else if (input == '*'||input == '/'||input == '+'|| input =='-')
             while (!s.empty()) 
       {
                  sort(input, input + 4, &compareprec); // More Errors Here?
           cout << s.top() << "\n ";
    s.pop();
                  s.push(input);
       }
        }
    while (!s.empty())
    {
        cout << s.top() << " ";
        s.pop();
    }
}

Но я продолжаю получать сообщение об ошибке:

error: no matching function for call to 'sort(char&, int, bool (*)(char, char))'
error: no matching function for call to 'sort(char&, int, bool (*)(char, char))'

И я не уверен почему. Я знаю, что это, вероятно, что-то болезненно очевидное / глупое, но я не могу понять это. Любая помощь будет оценена. Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 24 января 2011

сортировка ожидает что-то, что может быть повторено.

Ваш рабочий пример имеет

 char input[]

(массив символов)

Ваш нерабочий пример удаляет синтаксис массива и делает его простым символом

 char input

Когда вы пытаетесь сделать:

 sort(input, input + 4, &compareprec)

В рабочем случае, поскольку вы предоставляете массив, вы говорите ему перебирать от начала ввода до 4 после местоположения.В нерабочем случае вы говорите, чтобы перейти от «а» к «d» (то есть «а» + 4).

1 голос
/ 10 февраля 2011

Почему вы должны что-то сортировать во втором примере? У вас есть максимум два оператора, которые вы должны сравнить, один на вершине стека и один на входе. Просто используйте вашу compareprec -функцию и действуйте соответственно, основываясь на результате.

И, кстати, чтобы сделать ваш код немного красивее, создайте функцию:

 bool is_operator(char s);

Почти забыл сказать, что версия int prec(char a) во втором примере неверна, используйте первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...