Вы можете рассмотреть что-то вроде этого.
#define PLUS +
#define MINUS -
#define UMINUS _
#define DILIM_CLOSE 1
#define DILIM_OPEN 0
#define OPERAND 2
#define FACT !
// i is the present location being parsed in the infix string
// infix is an array holding the infix string
// this code can go to the tokeniser
// optr_type returns the type of operator, or even if it is an operand
if(infix[i]==PLUS || infix[i]==MINUS)
{
int sign=1,st=i;
while(infix[i]==PLUS || infix[i]==MINUS)
if(infix[i++]==MINUS)
sign*=-1;
if(sign==-1)
{
if((optr_type(infix[st-1])==OPERAND) ||optr_type(infix[st-1])==DILIM_CLOSE || infix[st-1]==FACT)
return MINUS;
else
return UMINUS;
}
if(sign==1)
{
if((optr_type(infix[st-1])==OPERAND) || optr_type(infix[st-1])==DILIM_CLOSE || infix[st-1]==FACT)
return PLUS;
else
return UPLUS;
}
}
Когда вы обнаружите, что после плюса или минуса была полоса минусов, продолжайте переворачивать знак.Если sign = -1
, то вы заменяете серию минусов одним -
.Например --1 = 1
и ---1 = -1
.В условии sigh == -1
, если предыдущая позиция, сохраненная в st
, является операндом, закрывающим парантезом (любого рода) или факториальным знаком, то это двоичный минус, иначе это должен быть унарный минус.То же самое с унарным плюсом.
После того, как вы маркируете оператор как унарный, его легко оценить, но вы должны решить, основываясь на типе оператора.Если это двоичный файл, дважды нажмите и примените двоичный оператор, если он унарный, один раз нажмите и примените оператор.