2014-12-11 56 views
2

我正在製作一個反向波蘭記法計算器的程序,我想知道是否有人可以給我一些提示。計算器將從用戶那裏吸取一行,如2 3 + 7 4 - *;中間有空格,我想在每次操作後打印一個結果。我需要我的反向波蘭記法計算器上的幫助

這裏是我的代碼

#include <iostream> 
#include <string> 
#include <stack> 
#include <sstream> 
using namespace std; 

int main() { 
    stack<float>stack; 
    int i; 
    float num,result,first,second; 
    char op,ch; 
    string str; 

    getline(cin,str); 
    istringstream is(str); 
    for(int i=0;i<str.size();i++) { 
    is>>num; 
    stack.push(num); 
    } 
    for (i=0;i<str.size();++i) { 
    ch=str[i]; 
    } 
    if (ch=='+'||'-'||'*'||'/') { 
    if (ch='+') { 
     first=stack.top(); 
     stack.pop(); 
     second=stack.top(); 
     stack.pop(); 
     result=first+second; 
     stack.push(result); 
     cout<<result; 
    } 
// } // missing from question 
//} 

我已經越來越奇異數作爲結果的一部分。 我正確讀取我的堆棧嗎?

+0

爲什麼你在不可讀的方式編寫代碼? – Shoe 2014-12-11 06:06:08

回答

0

乾淨而優雅的做法是將所有條目作爲浮點數推入堆棧(如果不是它們是運算符),並在遇到操作符獲取操作符時在堆棧上執行彈出操作。如果它的一名操作員執行兩次彈出操作並執行操作並執行相應的操作並將結果推回堆棧

有線數字輸出的原因是您在堆棧中也有運算符的浮點值,並且你循環查找運算符。因此,對於示例2 3 + 7 4 - *。您將堆棧設置爲2 3 float(+)7 4 float( - )float(*)< - 作爲堆棧頂部。所以當你循環查找字符串並找到'+'符號時。您添加float(*)和float( - )的值並將其推入堆棧。我希望這會使你的疑問清楚。 :)

編輯: 這是上述說明的代碼。

#include <iostream> 
#include <string.h> 
#include <stack> 
#include <sstream> 
#include <stdlib.h> 

using namespace std ; 

int main() 
{stack<float>stack; 
int i; 
float num,result,first,second; 
char op,ch; 
string str,str1; 

getline(cin,str); 
istringstream is(str); 

for(;is>>str1;){ 

if(str1.compare("+")==0){ 

    first=stack.top(); 
    stack.pop(); 
    second=stack.top(); 
    stack.pop(); 


    stack.push(first+second); 

    }else if(str1.compare("-")==0){ 

    first=stack.top(); 
    stack.pop(); 
    second=stack.top(); 
    stack.pop(); 
    stack.push(first-second); 
    }else if(str1.compare("*")==0){ 

    first=stack.top(); 
    stack.pop(); 
    second=stack.top(); 
    stack.pop(); 
    stack.push(first*second); 
    }else if(str1.compare("/")==0){ 

    first=stack.top(); 
    stack.pop(); 
    second=stack.top(); 
    stack.pop(); 
    stack.push(first/second); 
    }else{ 

    stack.push(strtof(str1.c_str(),NULL));    
    } 
} 
cout<<"The result of the expression is:"<<stack.top(); 
} 
3

這可能不是你的唯一的問題,但你必須:

if (ch=='+'||'-'||'*'||'/') { 

時,你可能實際上意味着:

if (ch=='+' || 
    ch=='-' || 
    ch=='*' || 
    ch=='/') { 

而且有權根據您有:

if (ch='+') { 

你可能會採取行動ually意味着:

if (ch=='+') { 

=是分配(要設置ch'+'),而==是比較(要測試是否ch等於'+'