【问题标题】:Postfix evaluation后缀评估
【发布时间】:2013-09-20 04:07:08
【问题描述】:

我正在编写一个评估给定后缀表达式的代码。每个操作数和运算符由空格分隔,最后一个运算符后跟一个空格和一个“x”。

例子:

中缀表达式:(2*3+4)*(4*3+2)

后缀表达式:2 3 * 4 + 4 3 * 2 + * x

x”表示表达式的结束。

输入(后缀表达式)作为字符串来自另一个函数,该函数将中缀表达式转换为后缀表达式。

后缀求值函数为:

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;
}

我给出的示例的输出应该是“140”,但我得到的是“6”。请帮我找出错误。

push和pop方法如下(以防有人要查看):

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;
}

【问题讨论】:

    标签: c++ postfix-notation


    【解决方案1】:
    while((ch[i] != ' ')&&(ch[i+1] != 'x'))
    

    只要 a) 当前字符是空格, b) 下一个字符是“x”,您就会退出此循环。当前角色在此过程的早期就变成了一个空格;你只处理字符串的一小部分。

    【讨论】:

      【解决方案2】:

      尝试与以下代码进行比较。

      #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;
      }
      

      【讨论】:

        猜你喜欢
        • 2018-03-12
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-26
        • 2013-12-21
        • 2012-05-01
        • 2013-05-02
        相关资源
        最近更新 更多