Использование стеков в C ++ для выражений infix и postfix - PullRequest
1 голос
/ 23 января 2011

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

(a + b * c)

, тогда программа должна отобразить:

abc * +

до сих пор, У меня есть это:

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


using namespace std;

int main()
{
    stack<char> s;
    char input;
    while (cin.get(input) && input != '\n')
        {
            if (isalnum(input))
                cout << input << "\n";
            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 == '*'||'/'||'+'||'-' && s.top() < input) // Error Begins Here?
     {
         char a = '*';
         char b = '/';
         char c = '+';
         char d = '-';
         bool prec (char a, char b, char c, char d);
             return ('*' > '/' > '+' > '-');
             s.push(input);
     }
         else if (input == '*'||'/'||'+'||'-' && s.top() >= input)
             while (!s.empty()) 
          {
              cout << s.top();
          s.pop();
                  s.push(input);
          }
        }
    while (!s.empty())
    {
        cout << s.top();
        s.pop();
    }
}

, который компилируется и работает, но не функционирует, как следует.Когда вводится выражение типа «ab», программа будет отображать «ab», как и должно, но если я введу «a + b + c», то будет отображаться только «a».Это означает, что программа не помещает операторы в стек, который будет отображаться позже.Мне нужна помощь, чтобы изменить программу так, чтобы при вводе оператора он добавлялся в стек и затем отображался в зависимости от его приоритета (*> /> +> -) после операндов, когда ввод выполнен.

Я довольно новичок в C ++ и программировании в целом, поэтому любые предложения будут хороши.

Ответы [ 3 ]

2 голосов
/ 23 января 2011

Проблема здесь:

bool prec (char a, char b, char c, char d);
return ('*' > '/' > '+' > '-');

Я предполагаю, что это предназначено для определения функции приоритета, но это не то, что она делает. Первая строка объявляет, что такая функция существует (и ее аргументы не имеют ничего общего с переменными, объявленными в предыдущих строках), а вторая вызывает завершение всей программы. Если вам нужна такая функция, вы должны определить ее вне main.

Здесь чуть менее существенная ошибка:

if (s.empty() && input == '*'||'/'||'+'||'-' && s.top() < input)

Во-первых, эта часть

input == '*'||'/'||'+'||'-'

интерпретируется как

(input == '*') || ('/') || ('+') || ('-')

Последние три термина верны, первый не имеет значения. И я даже не уверен, что s.top() делает, если s пусто.

Этого должно быть достаточно для продолжения. Я предлагаю вам начать с создания и тестирования процедур, которые могут, например, идентифицировать операторов и оценить их приоритетность, прежде чем пытаться собрать все в одну программу.

2 голосов
/ 23 января 2011
else if (input == '*'||'/'||'+'||'-' && s.top() >= input)

Это не делает то, что вы думаете, что делает.Вам нужно сделать

else if (input == '*'|| input == '/'|| input == '+'|| input == '-' && s.top() >= input)

И это тоже похоже на ошибку

bool prec (char a, char b, char c, char d);

Это синтаксис для прототипа функции.Вы уверены, что это компилируется?

0 голосов
/ 23 января 2011

Фальмарри прав, просто хотел опубликовать это сам, и он компилируется, я попробовал, но есть еще одна вещь: вы сказали else if (s.empty() && input == '*'||'/'||'+'||'-' && s.top() < input) // Error Begins Her е? Вы уверены, что даже достигли этой точки, потому что когда я запускаю ее, она просто останавливается на:

while (cin.get(input) && input != '\n')

пока я не нажму Enter, и даже больше, вы можете ввести более одного символа из consol, находясь в cin.get (вход), но вход будет содержать только первый введенный символ. Чтобы решить эту проблему, я просто положил #include <conio.h> в начале используется

while ((input = getch()) && input != (char)13) in staid of you're code  

краткое объяснение

getch()

возвращается после нажатия только одного символа и

input! = (Char) 13 требуется на месте вход! = '\ n' потому что getch () return (char) 13 для ENTER см. таблицу ASCII для получения дополнительной информации.

...