2013-10-15 55 views
1

我正在開發一個程序,該程序計算我的一個計算機科學類的後綴表達式的結果。該程序使用堆棧ADT來實現這一點。使用堆棧的C++後綴表達式

我已經編寫了程序,但相信可能有錯誤,因爲某些表達式的結果不正確。我不確定我的錯誤在哪裏。

另外,當輸入文件爲空時,程序產生一個32767的值。那裏是從哪裏來的?

表達式:3 4 + 3 * 值= 21

表達式:5 4 3 2 1 - +/* 值= 0。(應爲5)

表達式:9 5 2 4 + - 2 * * 值= 18(應爲-18)

頭文件:

#ifndef STACK_H 
#define STACK_H 

#include <cstdlib> 
#include <iostream> 

class Stack 
{ 
    public: 
     typedef int Item; 
     static const int CAPACITY = 50; 

     // Constructor 
     Stack() { used = 0; } 

     // Modification Member Functions 
     void push(Item entry) { 
      data[used] = entry; 
      ++used; 
     } 
     Item pop() { 
      if(!empty()) 
      { 
       --used; 
       return data[used]; 
      } 
     } 

     // Constant Member Functions 
     bool empty() const { return used == 0; } 
     int size() const { return used; } 

    private: 
     // Data Members 
     Item data[CAPACITY]; 
     int used; 
}; 
#endif 

主程序:

#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include "stack.h" 
using namespace std; 

int main() 
{ 
    Stack s; 
    string input; 
    ifstream infile; 
    int final, operand1, operand2, result; 
    char infile_name[80]; 

    cout << "Enter input file name: "; 
    cin >> infile_name; 
    cout << endl; 

    infile.open(infile_name); 
    while(!infile) 
    { 
     cout << "Could not open file." << endl; 
     return 0; 
    } 

    while (!infile.eof()) 
    { 
     getline(infile, input); 
     cout << "Expression: "; 
     for (int i = 0; i < input.length(); i++) 
     { 
      cout << input[i]; 
      if(input[i] == '1' || input[i] == '2' || input[i] == '3' || input[i] == '4' || input[i] == '5' || input[i] == '6' || input[i] == '7' || input[i] == '8' || input[i] == '9') 
       s.push(input[i] - '0'); 
      if(input[i] == '+') 
       s.push(s.pop() + s.pop()); 
      if(input[i] == '-') 
       s.push(s.pop() - s.pop()); 
      if(input[i] == '*') 
       s.push(s.pop() * s.pop()); 
      if(input[i] == '/') 
       s.push(s.pop()/s.pop()); 
     } 
     final = s.pop(); 
     cout << endl << "Value = " << final << "." << endl << endl; 
    } 
} 
+1

爲什麼不使用'isdigit'而不是'input [i] =='1'' ... –

+0

你試過調試過嗎? –

回答

3

一個問題是,在聲明s.pop() - s.pop()(以及類似的部門)中,無法保證哪個s.pop()首先被調用。因此,從堆棧中刪除東西的順序並不一致。你應該做兩個獨立的電話。

auto oper1 = s.pop(); 
auto oper2 = s.pop(); 
s.push(oper1-oper2); 

您的錯誤結果是由於這兩個操作按照錯誤的順序執行,在您的情況下。

+0

非常感謝!這解決了這個問題。 – Mitchell

2

while (!infile.eof())這樣的代碼實際上總是一個錯誤。它通常會顯示兩次輸入的最後一項(儘管這不可靠)。

開始改變:

while (!infile.eof()) 
{ 
    getline(infile, input); 

到:

while (getline(infile, input)) 

,看看它不工作得更好。

還要注意的是,如果堆棧是空的stack.pop()不返回值:

Item pop() { 
    if (!empty()) 
    { 
     --used; 
     return data[used]; 
    } 
} 

如果(舉例來說)你有額外的操作,你會嘗試當它不是招」使用的值實際上返回一個,導致未定義的行爲。

+0

謝謝!這解決了空文件的問題。 – Mitchell