Как я могу преобразовать инфикс в постфиксное выражение многозначных операндов?

Я могу конвертировать инфикс в постфикс и рассчитывать с одной цифрой, но я не могу конвертировать в постфикс и рассчитывать с N цифрами. PLz кто-нибудь, помогите мне! Спасибо!!

вот мой код с одной цифрой

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>

using namespace std;

class infix2postfix
{
public:
void push(int symbol);
int pop();
void infix_to_postfix();
int priority(char symbol);
int isEmpty();
int white_space(char);
int eval_post();
};

char infix[100], postfix[100];
int stack[100];
int top;

int main()
{
infix2postfix ip;
top=-1;
cout<<"Enter infix : ";
gets(infix);
ip.infix_to_postfix();
cout<<"Postfix : "<<postfix<<endl;
cout<<"Result is : "<<ip.eval_post()<<endl;
return 1;
}

void infix2postfix :: infix_to_postfix()
{
int i,p=0;
char next;
char symbol;
for(i=0; i<strlen(infix); i++)
{
symbol=infix[i];
if(!white_space(symbol))
{
switch(symbol)
{
case '(':
push(symbol);
break;
case ')':
while((next=pop())!='(')
postfix[p++] = next;
break;
case '+':
case '-':
case '*':
case '/':
case '%':
case '^':
while( !isEmpty( ) &&  priority(stack[top])>= priority(symbol) )
postfix[p++]=pop();
push(symbol);
break;
default: /*if an operand comes*/
postfix[p++]=symbol;
}
}
}
while(!isEmpty( ))
postfix[p++]=pop();
postfix[p]='\0'; /*End postfix with'\0' to make it a string*/
}

/*This function returns the priority of the operator*/
int infix2postfix :: priority(char symbol)
{
switch(symbol)
{
case '(':
return 0;
case '+':
case '-':
return 1;
case '*':
case '/':
case '%':
return 2;
case '^':
return 3;
default :
return 0;
}
}

void infix2postfix :: push(int symbol)
{
if(top>100)
{
cout<<"Stack overflow\n";
exit(1);
}
stack[++top]=symbol;
}

int infix2postfix :: pop()
{
if( isEmpty() )
{
cout<<"Stack underflow\n";
exit(1);
}
return (stack[top--]);
}

int infix2postfix :: isEmpty()
{
if(top==-1)
return 1;
else
return 0;
}

int infix2postfix :: white_space(char symbol)
{
if( symbol == ' ' || symbol == '\t' )
return 1;
else
return 0;
}

int infix2postfix :: eval_post()
{
int a,b,i,temp,result;
for(i=0; i<strlen(postfix); i++)
{
if(postfix[i]<='9' && postfix[i]>='0')
push(postfix[i]-'0');
else
{
a=pop();
b=pop();
switch(postfix[i])
{
case '+':
temp=b+a;
break;
case '-':
temp=b-a;
break;
case '*':
temp=b*a;
break;
case '/':
temp=b/a;
break;
case '%':
temp=b%a;
break;
case '^':
temp=pow(b,a);
}
push(temp);
}
}
result=pop();
return result;
}

Мой вопрос: как получить результат для более чем 1-значного операнда?
Я пытался использовать однозначную цифру, но как я могу получить многозначные числа?

-1

Решение

В настоящее время вы помещаете цифры в стек по отдельности, поэтому числовое значение 10 в стек будут помещены два символа: 1 а также 0,

В логике вашего оператора вы выталкиваете один символ из стека на каждый операнд. Таким образом, многозначные операнды не будут работать и давать совершенно неверные результаты.

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

Место для этого будет внутри push, Вот как это сделать:

void infix2postfix :: push(int symbol)
{
if(top>100)
{
cout<<"Stack overflow\n";
exit(1);
}
if (! isEmpty() && stack[top] >= 0 && stack[top] <= 9) {
stack[top] *= 10;
stack[top] += symbol;
}
else {
stack[++top]=symbol;
}
}

Это будет работать до тех пор, пока числовой операнд помещается в диапазон типа int. Большие числа будут просто переполнены.

Также будут проблемы, потому что числа нельзя отличить от других символов стека. С многозначными числами теперь вы можете иметь символы, которые имеют то же значение int, что и оператор. Чтобы это исправить, можно назначить отрицательные значения int символам оператора и неотрицательные значения для чисел. Это будет работать для вашего случая, так как у вашей грамматики, кажется, нет унарного минуса.
Этот подход также соответствует тому, что вы делаете в eval_postгде вы помещаете результат вычисления в стек как одно целое число, независимо от того, сколько цифр может содержаться.

Самая мощная, но сложная альтернатива — написать грамматику и использовать генератор парсера. рекомендую GNU бизон. Это полностью возьмет на себя генерацию кода для синтаксического анализатора, поэтому все, что вам нужно сделать, это написать грамматику для ваших выражений плюс фактическое преобразование из инфикса в постфикс (что будет тривиально с бизоном). Это также поможет вам легко обнаружить неправильный ввод и предоставить соответствующие сообщения об ошибках.

Однако начать работать с зубрами может быть сложно, если вы никогда не использовали его раньше.

1

Другие решения


По вопросам рекламы [email protected]