急! C++中stack,pop的操作

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

这是我改了之后的。虽然没报错了。但是还是不能运行额。。。
回文就是正着念和倒着念一样。。。
麻烦大家帮帮忙

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

参考资料:原创

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-21
上面的已经说的很清楚了,对于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这种和其他变量相同的写法就可以了。
第2个回答  2011-03-20
pop无返回值,用top,再pop。

strcmp不能对string变量,改为strcmp(s1.c_str(),s2.c_str()),可以直接s1 != s2。
第3个回答  2011-03-20
strcmp这个函数原形是 int strcmp(char *,char*),你传入一个string的对象进去是不行的。
相似回答