#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include "NodeType.h"
using namespace std;
// Test if token is an operator
bool isOperator(char token);
int getPrecedence(char token);
bool comparePrecedence(char tokenA, char tokenB);
int main()
{
stack<char> tokenStack;
queue<char> tokenQueue;
string expression= "", postfix= "";
char x;
cout<<"Please enter a mathematical expression: "<<endl;
getline(cin, expression);
cout<<expression.length()<<endl;
for(int i = 0; i <= expression.length(); i++)
{
x = expression[i];
if(isdigit(x))
{
tokenQueue.push(x);
}
if(isOperator(x))
{
while((!tokenStack.empty()) && (comparePrecedence(x, tokenStack.top() == true)))
{
char z = tokenStack.top();
tokenQueue.push(z);
tokenStack.pop();
}
tokenStack.push(x);
}
if(x == '(')
{
tokenStack.push(x);
}
if(x == ')')
{
while((!tokenStack.empty()) && (tokenStack.top() != '('))
{
char z = tokenStack.top();
tokenQueue.push(z);
tokenStack.pop();
}
tokenStack.pop();
}
while(!tokenStack.empty())
{
char z = tokenStack.top();
tokenQueue.push(z);
tokenStack.pop();
}
}
return 0;
}
int getPrecedence(char token)
{
if((token == '+') || (token == '-'))
{
return 1;
}
else if((token == '*') || (token == '/'))
{
return 2;
}
else if ((token == '(') || (token == ')'))
return 0;
else
return 99;
}
// Test if token is an operator
bool isOperator(char token)
{
return token == '+' || token == '-' ||
token == '*' || token == '/';
}
bool comparePrecedence(char tokenA, char tokenB)
{
if(getPrecedence(tokenA) < getPrecedence(tokenB))
return true;
else
return false;
}
По какой-то причине я не могу заставить свой код работать правильно. Он всегда выдает ошибку Thread 1: EXC_BAD_ACCESS (code = EXC_1386_GPFLT). Он также неправильно размещает знак «+», когда я тестирую с помощью простой строки, такой как: (3 + 4). Очередь должна выглядеть так: 34+, но она удерживает 3 + 4. Мне кажется, что оператор «+» никогда не попадает в стек. Может ли кто-нибудь помочь мне найти то, на что я должен обратить внимание?C++ Математическое выражение Parser Issue
И когда вы разобрали свой код через отладчик, что вы узнали? Или вы предпочитаете просто спрашивать других, а не изучать инструменты своего ремесла? Извините, если это звучит суровым, но научиться использовать инструменты - _exactly_, на что вы должны обратить внимание. – paxdiablo
@paxdiablo Когда я прошел через отладчик (с несколькими различными тестовыми примерами), программа зависает на «+» или любом другом операторе, который я использую. Я больше беспокоюсь об ошибке, чем когда я шагнул через алгоритм вручную, я не вижу причин, по которым «+» попадает прямо в очередь, а не в стек. –
Ной, используя навыки отладки, я провел анализ вашего кода, используя проработанная техника «использования bucketloads выходных инструкций» :-) Надеюсь, мой ответ ниже поможет вам. – paxdiablo