2015-04-08 169 views
0

我在尋找的東西,解釋我如何可以計算一個Polish Expression,例如:計算波蘭表達式

,如果我有這個((1+2)*4)+3,以正常的方式是1+2*4+3 = 15,但我需要 寫這樣:12+4*3+使用stack獲得最高的價值,並在堆棧中再次把,看我的代碼:https://ideone.com/0bdkkM

我已經看到一個職位,但我不明白我怎麼可以讓所需要的操作:StackOverflow

+8

'1243 + * +'不是'((1 + 2)* 4)+ 3'的逆波蘭表示法。 '12 + 4 * 3 +'是。 –

+0

維基百科有關RPN的[有很好解釋和算法的文章](http://en.wikipedia.org/wiki/Reverse_Polish_notation)。 – legends2k

+0

不錯SO帖子:http://stackoverflow.com/questions/12023151/prefixpolish-notation-evaluation-c – NathanOliver

回答

1

這是一個簡單的RPN評估器,沒有任何錯誤處理。你只需要一個堆棧來存儲操作數,而不是操作符,這使得它很容易實現。

請注意,該版本假設操作數是輸入表達式上的單個數字。我這樣做是爲了簡化解析RPN表達式。在現實生活中,你會想要處理多位數的操作數。

std::stack<int> stack; 

const char *expression="12+4*3+"; 

for(char c=*expression; c!=0; c=*expression++) 
{ 
    switch(c) 
    { 
     case '+': 
     { 
      int rhs=stack.top(); stack.pop(); 
      int lhs=stack.top(); stack.pop(); 
      int result=lhs+rhs; 
      stack.push(result); 
      break; 
     } 

     case '-': 
     { 
      int rhs=stack.top(); stack.pop(); 
      int lhs=stack.top(); stack.pop(); 
      int result=lhs-rhs; 
      stack.push(result); 
      break; 
     } 

     case '*': 
     { 
      int rhs=stack.top(); stack.pop(); 
      int lhs=stack.top(); stack.pop(); 
      int result=lhs*rhs; 
      stack.push(result); 
      break; 
     } 

     case '/': 
     { 
      int rhs=stack.top(); stack.pop(); 
      int lhs=stack.top(); stack.pop(); 
      int result=lhs/rhs; 
      stack.push(result); 
      break; 
     } 

     default: 
      int number=(c-'0'); 
      stack.push(number); 
      break; 
    } 
} 

int final_result=stack.top(); 
std::cout << "result is " << final_result << std::endl; 
1

Reverse Polish成爲流行的原因是因爲它很好地映射到了堆棧的計算機概念。

當用戶輸入一個號碼時,將其推入堆棧。

當用戶輸入一個操作符時,從堆棧中彈出2個數字,計算結果並將結果推回堆棧。

+0

您還需要考慮運營商的優先級 – Sean

+2

@謝恩不,你不這樣做,這就是逆波蘭這麼簡單。用戶負責重新排列優先表達式。 –

+0

它會將表達式轉換爲RPN。 – Sean