2013-09-20 2 views
1

Я пишу код, который оценивает данное выражение Postfix. Каждый операнд и оператор разделяются пробелом, а за последним оператором следует пустое пространство и «х».Оценка Postfix

Пример:

выражение инфиксной: (2 * 3 + 4) * (4 * 3 + 2)

Постфикс выражение: 2 3 * 4 + 4 3 * 2 + * х

"x" подразумевает конец выражения.

Ввод (выражение Postfix) задается как строка из другой функции, которая преобразует выражение инфикса в постфиксное выражение.

Функция для оценки постфикса является:

int pfeval(string input) 
{ 
int answer, operand1, operand2, i=0; 
char const* ch = input.c_str(); 
node *utility, *top; 
utility = new node; 
utility -> number = 0; 
utility -> next = NULL; 
top = new node; 
top -> number = 0; 
top -> next = utility; 

while((ch[i] != ' ')&&(ch[i+1] != 'x')) 
{ 
    int operand = 0; 
    if(ch[i] == ' ') //to skip a blank space 
     i++; 
    if((ch[i] >= '0')&&(ch[i] <= '9')) //to gather all digits of a number 
    { 
     while(ch[i] != ' ') 
     { 
      operand = operand*10 + (ch[i]-48); 
      i++; 
     } 
     top = push(top, operand); 
    } 
    else 
    { 
     top = pop(top, operand1); 
     top = pop(top, operand2); 
     switch(ch[i]) 
     { 
     case '+': answer = operand2 + operand1; 
     break; 
     case '-': answer = operand2 - operand1; 
     break; 
     case '*': answer = operand2 * operand1; 
     break; 
     case '/': answer = operand2/operand1; 
     break; 
     case '^': answer = pow(operand2, operand1); 
     break; 
     } 
     top = push(top, answer); 
    } 
    i++; 
} 
pop(top, answer); 
cout << "\nAnswer: " << answer << endl; 
return 0; 
} 

Выход для примера я дал должен быть «», но то, что я получаю «». Пожалуйста, помогите мне найти ошибку.

толкающего и поп-методы являются следующие (в случае, если кто-то хочет пересмотреть):

class node 
{ 
public: 
int number; 
node *next; 
}; 

node* push(node *stack, int data) 
{ 
node *utility; 
utility = new node; 
utility -> number = data; 
utility -> next = stack; 
return utility; 
} 

node* pop(node *stack, int &data) 
{ 
node *temp; 
if (stack != NULL) 
{ 
    temp = stack; 
    data = stack -> number; 
    stack = stack -> next; 
    delete temp; 
} 
else cout << "\nERROR: Empty stack.\n"; 
return stack; 
} 

ответ

0
while((ch[i] != ' ')&&(ch[i+1] != 'x')) 

Вы выпадать из этого цикла, как только) текущий символ пробел, или b) следующий символ - 'x'. Текущий символ становится пространством довольно рано в процессе; вы обрабатываете только небольшую часть строки.

+0

Такая глупая ошибка. Я не могу в это поверить. Благодаря! – usb

0

Попробуйте сравнить со следующим кодом.

#include<iostream> 
using namespace std; 
#include<conio.h> 
#include<string.h> 
#include<math.h> 

class A 
{ 
    char p[30],ch; 
    int i,top,s[30],y1,y2,x,y,r; 

public: 
    A() 
    { 
     top=-1; 
     i=0; 
    } 
    void input(); 
    char getsymbol(); 
    void push(int); 
    int pop(); 
    void evaluation(); 
}; 

void A :: input() 
{ 
    cout<<"enter postfix expression\n"; 
    gets(p); 
} 
char A :: getsymbol() 
{ 
    return p[i++]; 
} 
void A :: push(int ch) 
{ 
    if(top==29) 
     cout<<"stack overflow\n"; 
    else 
     s[++top]=ch; 
} 
int A :: pop() 
{ 
    if(top==-1) 
    { 
     cout<<"stack underflow\n"; 
     return 0; 
    } 
    else 
     return s[top--]; 
} 
void A :: evaluation() 
{ 
    ch=getsymbol(); 
    while(ch!='\0') 
    { 
     if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') 
     { 
      cout<<"enter the value for "<<ch; 
      cin>>x; 
      push(x); 
     } 
     if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='^') 
     { 
      y2=pop(); 
      y1=pop(); 
      if(ch=='+') 
      { 
       y=y1+y2; 
       push(y); 
      } 
      else if(ch=='-') 
      { 
       y=y1-y2; 
       push(y); 
      } 
      else if(ch=='^') 
      { 
       y=y1^y2; 
       push(y); 
      } 
      else if(ch=='*') 
      { 
       y=y1*y2; 
       push(y); 
      } 
      else if(ch=='/') 
      { 
       y=y1/y2; 
       push(y); 
      } 
      else 
      { 
       cout<<"entered operator has no value\n"; 
      }  
     } 
     ch=getsymbol(); 
    } 
    if(ch=='\0') 
    { 
     r=pop(); 
     cout<<"the result is "<<r; 
    } 
} 
int main() 
{ 
    A a; 
    int m=0; 
    while(m==0) 
    { 
     a.input(); 
     a.evaluation(); 
     cout<<"enter 0 to continue 1 to exit\n"; 
     cin>>m; 
    } 
    getch(); 
    return 0; 
} 
Смежные вопросы