3 回答

TA貢獻1871條經驗 獲得超13個贊
pop返回值類型是void(error C2440: '=' : cannot convert from 'void' to 'char'明確指出了這一點)。因為如果返回非void類型,返回時會調用復制構造函數,如果其中拋出異常就會在未完成構造的情況下中斷且無法簡單回滾,無法保證容器的異常安全性,所以在std::stack的設計時就考慮把返回棧頂元素的功能交給其它成員函數實現,這個成員函數的原型是const typename std::stack<T>::value_type& std::stack<T>::top() const;,在std::stack的類作用域內簡作const value_type top() const;,其中value_type是元素類型。
因此s2[len]=st.pop(); 是錯的。應該使用
s2[len]=st.top();
st.pop();
另外既然使用string,直接用==和!=比較就可以了。
strcmp的原型是int strcmp(const char*, const char*);,不接受string類型的參數,所以產生錯誤。
或者用string的成員函數c_str得到C風格字符串表示:strcmp(s1.c_str(),s2.c_str())。也可以不用string而用char數組,這樣就可以直接strcmp。
↑2011-3-20 20:36。
----
er...才注意到LZ用string而用的是operator[]……注意string和內置數組、vector、map等一樣,operator[]是不進行越界檢查的(上述除了內置數組外都有成員函數at完成相同功能并會在之前檢查是否越界,如果越界拋出out_of_range異常)……而LZ初始化后string自身管理的內存就已經確定了(因為沒進行調用會改變內存大小的操作),雖然通常是16字節,但不見得會有保證(取決于模板類std::basic_string的具體實現;這里LZ忘了len++和末尾置零。。。我這里改正之后還是有問題,應該就是這個原因)。對于string還是直接用+=在末尾增加內容比較好,如果內存不夠用會自動分配,而且也比較直觀。
如果一定要用[]最好自己用數組或者指針分配空間。
改好的代碼(只看第二個while循環就行):
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
int len=0;
string s1;
string s2;
stack<char> st;
cout<<"請輸入要判斷的字符串: ";
cin>>s1;
while(s1[len]!='\0')
{
st.push(s1[len]);
len++;
}
len=0;
while(st.size()!=0)
{
s2+=st.top();
st.pop();
}
if(s1==s2)
cout<<"該字符串為一個回文";
return 0;
}

TA貢獻1752條經驗 獲得超4個贊

TA貢獻1818條經驗 獲得超8個贊
pop無返回值,用top,再pop。
strcmp不能對string變量,改為strcmp(s1.c_str(),s2.c_str()),可以直接s1 != s2。
添加回答
舉報