2013-03-24 43 views
4

這個編譯良好,並且沒有空格,但是一旦我在其中放入空格,它或者告訴我它不是迴文或超時。任何幫助將不勝感激!帶棧和隊列的字符串迴文(C++)

int main() 
{ 
    queue<char> q; 
    stack<char> s; 
    string the_string; 
    int mismatches = 0; 
    cout << "Enter a line and I will see if it's a palindrome:" << endl; 
    cin >> the_string; 

    int i = 0; 
    while (cin.peek() != '\n') 
    { 
     cin >> the_string[i]; 
     if (isalpha(the_string[i])) 
     { 
      q.push(toupper(the_string[i])); 
      s.push(toupper(the_string[i])); 
     } 
     i++; 
    } 

    while ((!q.empty()) && (!s.empty())) 
    { 
     if (q.front() != s.top()) 
      ++mismatches; 

     q.pop(); 
     s.pop(); 
    } 

    if (mismatches == 0) 
     cout << "This is a palindrome" << endl; 
    else 
     cout << "This is not a palindrome" << endl; 

    system("pause"); 
    return EXIT_SUCCESS; 
} 
+3

'CIN >> the_string'不讀取行提示符建議。 – chris 2013-03-24 04:33:01

+0

爲什麼這麼複雜的解決方案?您可以在沒有堆棧或隊列的情況下執行迴文檢查。你也可以做到這一點,沒有任何額外的空間要求。 – user93353 2013-03-24 04:38:17

+1

@ user93353我認爲OP正在做他的功課,並且使用堆棧和隊列是必需的。 – fbafelipe 2013-03-24 04:54:44

回答

1

爲什麼這麼複雜?

你可以簡單地做:

#include <string> 
#include <algorithm> 

bool is_palindrome(std::string const& s) 
{ 
    return std::equal(s.begin(), s.begin()+s.length()/2, s.rbegin()); 
} 
+0

雖然我同意這將是一個不錯的方法,但您確實需要刪除空格以等同於他的算法嘗試的內容。 – 2013-03-24 04:37:54

+0

此外,我懷疑OP是在做功課。 – 2013-03-24 04:40:47

+1

作爲對問題的評論(作爲評論已經存在)比作爲答案更合適,因爲它不符合問題的約束。 – JBentley 2013-03-24 05:24:27

1

首先行

cin >> the_string; 

沒有得到一整行。其次,在調試你的算法時會打印出大量的信息。例如,如果您添加行

cout << "You entered: '" << the_string << "'" << endl; 

您可以很容易地看到您正在測試的字符串。

+0

他正在讀兩個地方。在用'cin >> the_string'循環之前,他閱讀第一個用戶類型的工作,然後在循環中用'cin >> the_string [i];'讀取char字符。請注意,如果用戶輸入「str1 str2_longer_than_str1」,它將溢出the_string,因爲它只能保持「str2_longer_than_str1」,而其大小隻適合「str1」。 – fbafelipe 2013-03-24 05:00:13

+0

謝謝,fbafelipe是對的,我刪除了第一個cin >> the_string;並使用getline(cin,the_string);它運作得非常好,謝謝你們兩位! – Da11aS 2013-03-24 06:10:39

1

我得到了這個解決方案工作得很好。

int main() 
{ 
    queue<char> q; 
    stack<char> s; 
    string the_string; 
    int mismatches = 0; 

    cout << "Enter a line and I will see if it's a palindrome:" << endl; 
    int i = 0; 

    while (cin.peek() != '\n') 
    { 
     cin >> the_string[i]; 
     if (isalpha(the_string[i])) 
     { 
      q.push(toupper(the_string[i])); 
      s.push(toupper(the_string[i])); 
    } 
    i++; 
    } 

    while ((!q.empty()) && (!s.empty())) 
    { 
     if (q.front() != s.top()) 
      ++mismatches; 

     q.pop(); 
     s.pop(); 
    } 

if (mismatches == 0) 
    cout << "This is a palindrome" << endl; 
else 
    cout << "This is not a palindrome" << endl; 

    system("pause"); 
    return EXIT_SUCCESS; 
} 
-1
void main() 
{ 
    queue<char> q; 
    stack<char> s; 
    char letter; 
    int mismatches = 0; 


    cout << "Enter a word and I will see if it's a palindrome:" << endl; 
    cin >> letter; 
    q.push(letter); 
    s.push(letter); 

    int i = 0; 
    while (cin.peek() != '\n') 
    { 
     cin >> letter; 
     if (isalpha(letter)) 
     { 
      q.push(letter); 
      s.push(letter); 
     } 
     i++; 
    } 

    while ((!q.empty()) && (!s.empty())) 
    { 
     if (q.front() != s.top()) 
      ++mismatches; 

     q.pop(); 
     s.pop(); 
    } 

    if (mismatches == 0) 
    { 
     cout << "This is a palindrome" << endl; 
    } 
    else 
    { 
     cout << "This is not a palindrome" << endl; 
    } 
    cout << endl; 
    cout << "Homework done!" << endl; 
    cout << "You are Welcome!" << endl; 
    system("pause"); 

} 
+3

請解釋您所做的更改以及原因 – 2015-11-12 03:17:51