Нотация Infix to Postfix не учитывает второй набор скобок - PullRequest
0 голосов
/ 20 декабря 2018

Возникают проблемы с получением правильного результата Infix: (A + B) / (CD) Postfix: AB + CD- /

Я продолжаю получать Postfix: AB + C / D-

Я знаю, что проблема в том, что не удается вытолкнуть последние операторы из стека перед нажатием '(' Вот почему я добавил оператор if в первое условие if. Это также не работает. Чтоэто именно то, что я делаю неправильно? Есть ли другой способ решения этой проблемы?

#include <iostream>
#include <stack>
#include <sstream>
#include <string>
using namespace std;

int precedence(char x) {
    int op;
    if (x == '(' || x==')')
        op = 1;
    else if (x == '^')
        op = 2;
    else  if (x == '*')
        op = 3;
    else  if ( x == '/')
        op = 4;
    else  if (x == '+')
        op = 5;
    else  if (x == '-')
        op = 6;
    return op;
}

int main() 
{
    string getInfix;
    cout << "Infix: ";
    getline(cin, getInfix);
    stack<char> opStack;
    stringstream showInfix;


    for (unsigned i = 0; i < getInfix.length(); i++) 
    {
        if (getInfix[i] == '+' || getInfix[i] == '-' || getInfix[i] == '*' || getInfix[i] == '/'  || getInfix[i] == '^') 
        {
            while (!opStack.empty() && precedence(opStack.top() <= precedence(getInfix[i])) 
            {
                showInfix << opStack.top();
                opStack.pop();
            }
            opStack.push(getInfix[i]);
        }
        else if (getInfix[i] == '(') 
        {
            opStack.push(getInfix[i]);
            opStack.pop();

            if (getInfix[i]=='(' && !opStack.empty()) 
            {
                opStack.push(getInfix[i]);
                opStack.pop();
            }
        }        
        else if (getInfix [i]==')') 
        {                   
          showInfix << opStack.top();
          opStack.pop();
        }
        else 
        {
            showInfix << getInfix[i];
        }
    }

    while (!opStack.empty()) 
    {
        showInfix << opStack.top();
        opStack.pop();
    }

    cout << "Postfix: "<<""<<showInfix.str() << endl;

    cin.ignore ( numeric_limits< streamsize >:: max(),'\n');
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Проблема возникает из этой строки (!opStack.empty() && precedence(opStack.top() <=precedence(getInfix[i]))

Вы добавляете последний найденный оператор, не проверяя, в скобках вы или нет.Перед добавлением оператора к выходной строке необходимо учитывать символы в скобках.

Не относится к вашей проблеме, но есть несколько советов:

  • отступ в вашем коде, упрощение видимости и доверие ко мне, экономит ваше (и нас) время.
  • Не push, а затем pop для ( или ) символов, это все равно, что игнорировать их.
  • Выпропуская ) в этой строке, я представляю, что это проблема копирования / вставки: while (!opStack.empty() && precedence(opStack.top() <=precedence(getInfix[i]))
  • Вы действительно понимаете, что тестируете приоритет для ( и ), но на самом деле вы никогда не вызываете этот метод с этимтип персонажа?
0 голосов
/ 20 декабря 2018

Вы не установили op

const int precedence(const char x) noexcept(true) {
  switch (x) {
    case '(': case ')':
      return 1;
    case '^':
      return 2;
    case '*':
      return 3;
    case '/':
      return 4;
    case '+':
      return 5;
    case '-':
      return 6;
  }  
  return -1;
}

Возвращает -1, но я позволю вам разобраться с этой частью.Это не отвечает на вопрос.Я просто остановился после того, как увидел, что вы можете читать значения мусора.

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