2011-01-24 112 views
0

我有一個簡單的程序,列出優先順序輸入,只爲運營商檢查和排名他們像這樣,「*/+ - 」:需要幫助使用「排序」在我的計劃

#include <iostream> 
#include <stack> 
#include <string> 


using namespace std; 

int prec(char op) 
{ 
    if (op == '*' || op == '/') return 0; 
    return 1; 
} 

bool compareprec(char a, char b) 
{ 
    return prec(a) < prec(b); 

} 

int main() 
{ 
    char input[] = "+-/*"; 
    cin >> input; 
    sort(input, input + 4, &compareprec); 
    cout << input; 
} 

我試圖在一個更復雜的程序中實現它,該程序使用堆棧來檢查字母數字輸入,並對後綴轉換進行中綴,將如下所示的內容排列爲:「9 * 9 + 9」到「9 9 9 * +」中。更復雜的程序如下:

#include <iostream> 
#include <stack> 
#include <string> 


using namespace std; 

int prec(char op) 
{ 
    if (op == '*' || op == '/' || op == '+' || op == '-') return 0; 
    return 1; 
} 

bool compareprec(char a, char b) 
{ 
    return prec(a) < prec(b); 

} 

int main() 
{ 
    stack<char> s; 
    char input; 
    while (cin.get(input) && input != '\n') 
     { 
      if (isalnum(input)) 
       cout << input << " "; 
      else if (input == '(') 
       s.push(input); 
      else if (input == ')') 
      { 
    while (!s.empty() && s.top() != '(') 
     { 
     cout << s.top() << " "; 
     s.pop(); 
    } 
     if(!s.empty()) 
        s.pop(); 
     else 
       cout << "ERROR: No Matching (\n"; 
    } 
    else if (s.empty() && input == '*'|| input == '/'|| input == '+'|| input == '-') 
    { 
      sort(input, input + 4, &compareprec); // Error Begins Here? 
      s.push(input); 
    } 
     else if (input == '*'||input == '/'||input == '+'|| input =='-') 
      while (!s.empty()) 
     { 
        sort(input, input + 4, &compareprec); // More Errors Here? 
      cout << s.top() << "\n "; 
    s.pop(); 
        s.push(input); 
     } 
     } 
    while (!s.empty()) 
    { 
     cout << s.top() << " "; 
     s.pop(); 
    } 
} 

但我不斷收到一個錯誤,指出:

error: no matching function for call to 'sort(char&, int, bool (*)(char, char))' 
error: no matching function for call to 'sort(char&, int, bool (*)(char, char))' 

而且我不知道爲什麼。我知道這可能是一些顯而易見的事情,但我無法弄清楚。任何幫助,將不勝感激。提前致謝!

+0

你想在這些陳述中排序?你沒有任何有效的排序。 – JaredC 2011-01-24 02:50:33

回答

3

排序期望可迭代的內容。

你的工作示例有

char input[] 

(一個字符數組)

你非工作示例刪除數組語法,並使其純炭

char input 

當您嘗試做:

sort(input, input + 4, &compareprec) 

在工作案例中,由於您正在提供一個數組,因此您要讓它從輸入的開頭迭代到位置後面的4。在非工作情況下,你告訴它從「a」到「d」(即'a'+ 4)。

+0

我試着將它改回「char input []」,但得到錯誤「錯誤:'input'的存儲大小未知」。 – UndefinedReference 2011-01-24 01:47:55

1

爲什麼你必須在第二個例子中排序任何東西?您最多需要比較兩個運算符,一個位於堆棧的頂部,另一個位於輸入中。只需使用你的compareprec功能,並根據結果採取相應的行動。

順便說一下,讓你的代碼變得更漂亮,創建一個函數:

bool is_operator(char s); 

差點忘了告訴你了,int prec(char a)在第二個例子中的版本是錯誤的,使用第一個。