2013-10-11 61 views
1

幾天前得到相同程序的幫助後,仇恨回來尋求幫助,但我真的很努力地完成這個程序。簡而言之,我需要創建一個帶鏈接列表堆棧的後綴表示法計算器(RPN),它允許我執行諸如5 5 5 + +(= 15)之類的表達式。我已經成功地完成了主要的計算部分,但是我正在努力處理兩個錯誤。其中之一是「運營商太多」,另一個是「運營商太多」。目前正在研究「太多運營商」,我覺得我很接近,但不能完全達到目標。後綴表示法計算器(RPN)問題C++

如果用戶在第一個條目中輸入5 5 + +,它會捕獲它並說「操作數太多」。但是,如果以前的計算已經在堆棧中,然後他們輸入相同的表達式5 5 + +,它並不是說堆棧是空的,而是使用前一個數字輸出答案。如果任何人都能看到我在哪裏出錯,並且指出我想要找出另一個錯誤「太多的操作員」(例如:5 5 5 +),我們將不勝感激。再次提前感謝。我猜測我需要在每個表達式之前的某處彈出,但不知道在哪裏把它,因爲我已經嘗試了很多地方,它不工作)

#include<iomanip> 
#include<iostream> 
#include<string> 
#include<sstream> 

using namespace std; 

class SLLNode 
{ 
    double data; 
    SLLNode *top; 
    SLLNode *ptr; 
public: 
    SLLNode() 
    { 
     top = NULL; 
     ptr = NULL; 
    } 

    bool isEmpty() 
    { 
     return top == 0; 
    } 

    void pushVal(double val) 
    { 
     SLLNode *next = new SLLNode; 
     next -> data = val; 
     next -> ptr = top; 
     top = next; 
    } 

    double popVal() 
    { 
     if (isEmpty()) 
     { 
      cout << "Error: Too many operators" << endl; 
     } 
     else 
     { 
     SLLNode *next = top -> ptr; 
     double ret = top -> data; 
     delete top; 
     top = next; 
     return ret; 
     } 

    } 

    void print() 
    { 
     cout << top -> data << endl; 
    } 
}; 


bool isOperator(const string& input) 
{ 
    string ops[] = {"+", "-", "*", "/"}; 
    for(int i = 0; i < 4; i++) 
    { 
     if(input == ops[i]) 
     { 
      return true; 
     } 
    } 
    return false; 
} 


void performOp(const string& input, SLLNode& stack) 
{ 
    double fVal, sVal; 
    int errorCheck = 0; 

    sVal = stack.popVal(); 
    fVal = stack.popVal(); 

    if(input == "+") 
    { 
     stack.pushVal(fVal + sVal); 
    } 
    else if(input == "-") 
    { 
     stack.pushVal(fVal - sVal); 
    } 
    else if(input == "*") 
    { 
     stack.pushVal(fVal * sVal); 
    } 
    else if(input == "/" && sVal != 0) 
    { 
     stack.pushVal(fVal/sVal); 
    } 


    if(input == "/" && sVal == 0) 
    { 
     cout << "Error: Division by zero" << endl; 
     errorCheck = 1; 
    } 

    if(errorCheck == 0) 
    { 
    stack.print(); 
    } 
} 

int main() 
{ 
    cout << "::::::::::::::::RPN CALCULATOR:::::::::::::::::" << endl; 
    cout << "::TYPE IN A POSTFIX EXPRESSION OR 'q' TO QUIT::" << endl; 
    cout << ":::::::::::::::::::::::::::::::::::::::::::::::" << endl << endl; 

    string input; 
    SLLNode stack; 
    while(true) 
    { 
     cin >> input; 
     double num; 

     if(istringstream(input) >> num) 
     { 
      stack.pushVal(num); 
     } 
     else if (isOperator(input)) 
     { 
      performOp(input, stack); 
     } 
     else if (input == "q") 
     { 
      return 0; 
     } 
    } 
} 
+0

「如果以前的計算已經在堆棧中,然後他們鍵入相同的表達式'5 5 ++',這並不是說堆棧是空的,而是用前面的數字輸出答案正在使用。」爲什麼這是一個問題?如果你輸入'2',然後輸入'5 5 ++',你不想打印12嗎? –

+0

與'5 5 5 +'類似:爲什麼這是一個問題?如果我想最終輸入'5 5 5 ++' - 爲什麼你想阻止我這樣做? –

+0

我只是想讓每一行成爲它自己的表達。如果有人輸入一個表達式5 5 5 +它必須輸出「太多的操作符」。對不起,我不確定你們在問什麼,因爲我對此很陌生。它應該只准備好(x)操作符的數量和(x-1)操作數的數量,如果不是這種情況,那麼我需要打印一個錯誤。如果某人僅輸入2,並且輸入,則輸入5 5 ++,我仍然希望它說太多的操作數。如果有人輸入2,輸入,然後5 5 +,我希望它說10. 10.謝謝。 – Tyler

回答

0

的基本思路是:

  1. 讀取一行(std::getline);
  2. 處理此行(std::stringstream);
  3. 輸出答案或任何錯誤;
  4. 清理堆棧(或在第2步中將其銷燬並創建一個新堆棧);
  5. 轉到1並重復。

你缺少的是第一步。如果直接從標準輸入中獲得所有內容,則會將新行視爲簡單的空白。