亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

急!求助在 C++中stack,pop的操作?請問該怎么辦?

急!求助在 C++中stack,pop的操作?請問該怎么辦?

慕哥9229398 2021-12-16 07:03:48
#include <iostream>#include <string>#include <stack>using namespace std;int main(){int len;string s1,s2;char temp;stack<char> st;cout<<"請輸入要判斷的字符串: ";cin>>s1;for(len=0;len<s1.length();len++){st.push(s1[len]);}for(len=0;len<s1.length();len++){s2[len]=st.pop(); //error C2440: '=' : cannot convert from 'void' to 'char'}if(!strcmp(s1,s2)) /*error C2664: 'strcmp' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'const char *'*/cout<<"該字符串為一個回文";return 0;}兩個錯誤解決不了啊。請問pop有返回值嗎?我把出棧的數據給一個變量卻不行。strcmp也是參數不匹配??急求啊#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]!=NULL){st.push(s1[len]);len++;}len=0;while(st.size()!=0){s2[len]=st.top();st.pop();}if(s1==s2)cout<<"該字符串為一個回文"; return 0;}這是我改了之后的。雖然沒報錯了。但是還是不能運行額。。。回文就是正著念和倒著念一樣。。。麻煩大家幫幫忙
查看完整描述

3 回答

?
慕桂英4014372

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;
}



查看完整回答
反對 回復 2021-12-19
?
溫溫醬

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

對于c++的stack,pop指的是移除棧頂的元素,而top是取出棧頂元素的內容但是不移除它。因此你這里想做的pop實際上是上面兩個操作的結合,因此你應該寫s2[len] = st.top(); st.pop();這樣就對了。此外對于字符串,C風格的字符串類型是char*,對于char*類型的操作定義在<string.h>或者<cstring>中,函數的形式大多為str...,例如你的strcmp;而C++風格的是string類,定義在<string>中,對于string類有很多中現成的方法,對于比較它們是否相等,只需要s1 != s2這種和其他變量相同的寫法就可以了。

查看完整回答
反對 回復 2021-12-19
?
弒天下

TA貢獻1818條經驗 獲得超8個贊

pop無返回值,用top,再pop。
strcmp不能對string變量,改為strcmp(s1.c_str(),s2.c_str()),可以直接s1 != s2。

查看完整回答
反對 回復 2021-12-19
  • 3 回答
  • 0 關注
  • 343 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號