此代码试图测试字符串是否为回文结构。它读取一串字符,在读取时将每个字符推入堆栈并同时将其添加到队列中。然后,它使用基本的堆栈和队列操作来确定字符串是否是回文。
程序在遇到上述错误时会爆炸:
inStack.push(inString[i]);
inQueue.push(inString[i]);
我不明白为什么或如何解决它。我已经对这个错误进行了研究,因为它适用于我的案例并没有取得多大成果。我对c ++很新,所以请原谅我,如果我忽略了一些愚蠢的东西。
代码如下:
#include <iostream>
#include <stack>
#include <queue>
#include <string>
using namespace std;
int main()
{
stack <string> inStack;
queue <string> inQueue;
string inString; //user input
int inLength; //loop counter variable
bool isPalindrome(false);
cout<<"Enter a word to see if it is a palindrome: ";
cin>>inString;
if (inString.size() > 0)
{
for (int i = 0; i <= inLength; i++)
{
inStack.push(inString[i]); //put string chars onto stack
inQueue.push(inString[i]); //add string chars to queue
}
isPalindrome = true;
while (isPalindrome && (!inStack.empty()) && (!inQueue.empty()))
{
if (inStack.top() != inQueue.front())
{
isPalindrome = false;
}
else
{
inStack.pop();
inQueue.pop();
}
}
}
if(isPalindrome == false)
{
cout<<"It is not a palindrome."<<endl;
}
else
{
cout<<"It is indeed a palindrome."<<endl;
}
return 0;
}
答案 0 :(得分:1)
您的代码中有三个主要错误。
您正在将字符推送到堆栈和定义为保存字符串的队列。字符串构造函数不能隐式地从char转换为字符串,因为没有构造函数接受char。你可能想把它们定义为:
stack<char> inStack;
queue<char> inQueue;
你没有设置inLength
;我建议添加像
inLength = inString.size();
在if (inString.size() > 0) {
修复后。
最重要的是,你使用i <= inLength
(在你的for循环条件中),这是行不通的;您应该使用<
,因为push
inString[inString.size()]
实际上推送的一个字符超出您输入的字符,这将始终导致isPalindrome == false
,因为您的堆栈和队列将无效相应的顶部和前面的(随机垃圾)字符。
这三项更改似乎足以修复您的项目。
一个更简单的解决方案,为您提供一个示例,说明如何使用C ++迭代器来减少为这些事情编写的代码量:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<char> left, right; // left-to-right and right-to-left lists
cout<<"Enter a word to see if it is a palindrome: ";
string inString; //user input
cin>>inString;
if(!inString.empty()){
// add characters left to right
left.insert(left.end(), inString.begin(), inString.end());
// add characters in reverse order, right to left
right.insert(right.end(), inString.rbegin(), inString.rend());
// compare the two vectors
if(left == right)
cout<<"It is indeed a palindrome."<<endl;
else
cout<<"It is not a palindrome."<<endl;
}
}
答案 1 :(得分:0)
你忘了给inLength分配字符串的实际长度并得到一个外部我变得非常大,比它应该更大,你可能会遇到分段错误。
在读取字符串后尝试正确分配值。
inLength = inString.size();
我希望这会对你有所帮助。