2012-09-10 4 views
0

вот моя попытка оценки оценки постфиксапостфикса алгоритм оценки

#include<iostream> 
#include<string> 
using namespace std; 
template<class T> 
class Stack 
{ 
private: 
    T *s;int N; 
public: 
    Stack(int maxn) 
    { 
     s=new T[maxn]; 
     N=0; 
    } 
    int empty()const 
    { 
    return N==0; 
    } 
    void push(T k) 
    { 
     s[N++]=k; 
    } 
    T pop() 
    { 
     return s[--N]; 
    } 
    }; 

int main() 
    { 
     //postfix evaluation 
     char *a="3+4*5"; 
     int N=strlen(a); 
     Stack<int>save(N); 
     for(int i=0;i<N;i++) 
     { 
      if(a[i]=='+') 
       save.push(save.pop()+save.pop()); 
      if(a[i]=='*') 
       save.push(save.pop()*save.pop()); 
      if((a[i]>='0' && a[i]<='9')) 
       save.push(0); 
      while((a[i]>='0' && a[i]<='9')) 
       save.push(10*save.pop()+(a[i++]-'0')); 
        } 
     cout<<save.pop()<<" "<<endl; 
    return 0; 
} 

но вместо ответа 23 потому, что 4 * 5 + 3 = 23, это дает мне ответить на 5, как я понял, этот код дает мне эту потому что, сначала он проверяет, есть ли + знак для i = 0, а это нет, тогда он проверяет, если это *, это тоже не так, поэтому сначала нажмите 0, затем он оценивает 10 * 0 + '3' -'0 ', который равен 3, (он будет вставляться в стек), для i = 1, a [i] равно 3, поэтому он печатает 3+, второй поп не определен, поэтому я думаю, что это ошибка, пожалуйста, помогите мне исправить это

+3

'3 + 4 * 5' является инфиксным, а не суффиксом (как выражение постфикса это будет' 3 4 5 * + '). Если вы хотите, чтобы ваш ввод использовался для нотации infix, вам придется преобразовать его, прежде чем вы сможете оценить его как постфиксное выражение (используя, например, [алгоритм шунтирования] (http://en.wikipedia.org/wiki/Shunting -yard_algorithm)). –

+0

Когда я перешел на постфикс, он оценил что-то вроде -33 тысячи, почему? –

+0

этот номер точно -33685674 –

ответ

1

Это работает с небольшим исправлением:

#include <iostream> 
#include <cstring> 

using namespace std; 

template<class T> 
class Stack 
{ 
private: 
    T *s; 
    int N; 

public: 
    Stack(int maxn) 
    { 
     s = new T[maxn]; 
     N = 0; 
    } 
    int empty()const 
    { 
     return N == 0; 
    } 
    void push(T k) 
    { 
     s[N++] = k; 
    } 
    T pop() 
    { 
     return s[--N]; 
    } 
}; 

int main() 
{ 
    //postfix evaluation 
    const char *a = "3 4 5*+"; 
    int N = strlen(a); 

    Stack<int>save(N); 

    for (int i = 0; i < N; i++) 
    { 
     if (a[i]=='+') 
      save.push(save.pop() + save.pop()); 

     if (a[i]=='*') 
      save.push(save.pop() * save.pop()); 

     if (a[i] >= '0' && a[i] <= '9') 
     { 
      save.push(0); 
      while (a[i] >= '0' && a[i] <= '9') 
       save.push(10 * save.pop() + a[i++] - '0'); 
      i--; 
     } 
    } 

    cout << save.pop() << " " << endl; 

    return 0; 
} 

Выход (ideone):

23 

Теперь, если вы удалите что i--; который я добавил, код будет пропускать символы в a[] из-за 2 приращений i, в a[i++] и for (int i = 0; i < N; i++).

Без i--; выход (ideone):

9 
+0

что делать, если мы не ставим вложение в выражение? –

+0

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

+0

нет ответа, просто я не поставил в то время как statment в выражение и так спросил –

Смежные вопросы