堆栈和队列回文程序
Stack and Queue Palindrome Program
我正在编写一个程序来确定用户输入的字符串是否为回文。程序可以编译,但是当打印输出时,所有字符串都被确定为回文,即使它们不是。教科书翻了好几遍,代码review调试了几十遍,看了其他类似的回文题,还是一头雾水
我的代码如下:
#include <iostream>
#include <stack>
#include <queue>
#include <string>
using namespace std;
int main (void)
{
stack <char> s;
queue <char> q;
string letter;
int length;
cout<<"Please enter a series of characters."<<endl;
getline (cin, letter);
length = letter.size();
for (int i=0; i<length; i++)
{
q.push(i);
s.push(i);
}
bool isPalindrome = true;
while (isPalindrome==true && (!s.empty() && !q.empty()))
{
if (s.top() != q.front())
{
isPalindrome = false;
}
else
{
q.pop();
s.pop();
}
}
if(isPalindrome==false && (s.empty() && q.empty()))
{
cout<<"True or false: "<<isPalindrome<<endl;
cout<<"Is not a palindrome."<<endl;
}
else
{
cout<<"Is a palindrome."<<endl;
}
}
如果有人能解释为什么会这样,我将不胜感激。谢谢!
这个条件
if(isPalindrome==false && (s.empty() && q.empty()))
永远不会等于 true。:)
因为你在循环中将 isPalindrome 设置为 false 而没有从堆栈和队列中弹出相应的元素
if (s.top() != q.front())
{
isPalindrome = false;
}
因此程序控制总是传递给else语句
else
{
cout<<"Is a palindrome."<<endl;
}
而不是if语句中的错误条件
if(isPalindrome==false && (s.empty() && q.empty()))
你可以这样写
if (isPalindrome == false )
或者干脆
if ( !isPalindrome )
或者您可以完全删除变量 isPalindrome 并使用条件
if ( s.empty() && q.empty() )
或更简单
if ( s.empty() )
程序可以这样看
#include <iostream>
#include <stack>
#include <queue>
#include <string>
int main()
{
while ( true )
{
std::string letters;
std::cout << "Please enter a string (Enter - exit): ";
std::getline( std::cin, letters );
if ( letters.empty() ) break;
std::stack<char>
s( std::stack<char>::container_type( letters.begin(), letters.end() ) );
std::queue<char>
q( std::queue<char>::container_type( letters.begin(), letters.end() ) );
while ( !s.empty() && s.top() == q.front() )
{
s.pop();
q.pop();
}
if ( s.empty() ) std::cout << "The string is a palindrome" << std::endl;
else std::cout << "The string is not a palindrome" << std::endl;
}
return 0;
}
在最后的 if
语句中,您不必要地检查 stack/queue 是否为空,因为如果上面的 isPalindrome
为假,它们很可能不会为空。
另外,看起来你想把
cout<<"True or false: "<<isPalindrome<<endl;
在 if
语句之前,以便它始终运行。
好吧,对于初学者来说,你推整数而不是字符。要推送字符串中的字符,请使用 q.push(letters[i])
而不是 q.push(i)
.
你也可以去掉栈,把一半的字符串压入队列,然后和另一半比较。像这样:
#include <iostream>
#include <queue>
#include <string>
using namespace std;
int main (void)
{
queue <char> q;
string letter;
int length;
cout<<"Please enter a series of characters."<<endl;
getline (cin, letter);
bool isPalindrome = false;
if (letters.size() > 0)
{
int length = letter.size() / 2;
for (int i=0; i<length; i++)
{
q.push(letters[i]);
}
isPalindrome = true;
for (int i = 1; i <= length && isPalindrome; ++i)
{
isPalindrome = q.front() == letters[letters.size() - i];
q.pop();
}
}
if(!isPalindrome)
{
cout<<"Is not a palindrome."<<endl;
}
else
{
cout<<"Is a palindrome."<<endl;
}
return 0;
}
或者您实际上可以避免为这样一个简单的任务使用繁重的数据结构,而使用一个简单的循环来执行此操作:
bool isPalindrome = false;
int len = letters.size();
if (len > 0)
{
isPalindrome = true;
for (int i = 0; i < len / 2 && isPalindrome; ++i)
{
isPalindrome = letters[i] == letters[len - i - 1];
}
}
#include<iostream>
#include <stack>
#include<queue>
#include<string>
using namespace std;
int main() {
queue<char> q;
stack <char> s;
string name;
int count = 0;
cout << "Please enter a name " << endl;
cin >> name;
for (int i = 0; i < name.size(); i++) {
q.push(name[i]);
s.push(name[i]);
}
bool check = true;
if (!q.empty() && !s.empty() && check){
if (s.top() == q.front()) {
q.pop();
s.pop();
cout << " It is a palindrome " << endl;
}
else
cout << " It's not a palindrome" << endl;
}
system("pause");
return 0;
}
我正在编写一个程序来确定用户输入的字符串是否为回文。程序可以编译,但是当打印输出时,所有字符串都被确定为回文,即使它们不是。教科书翻了好几遍,代码review调试了几十遍,看了其他类似的回文题,还是一头雾水
我的代码如下:
#include <iostream>
#include <stack>
#include <queue>
#include <string>
using namespace std;
int main (void)
{
stack <char> s;
queue <char> q;
string letter;
int length;
cout<<"Please enter a series of characters."<<endl;
getline (cin, letter);
length = letter.size();
for (int i=0; i<length; i++)
{
q.push(i);
s.push(i);
}
bool isPalindrome = true;
while (isPalindrome==true && (!s.empty() && !q.empty()))
{
if (s.top() != q.front())
{
isPalindrome = false;
}
else
{
q.pop();
s.pop();
}
}
if(isPalindrome==false && (s.empty() && q.empty()))
{
cout<<"True or false: "<<isPalindrome<<endl;
cout<<"Is not a palindrome."<<endl;
}
else
{
cout<<"Is a palindrome."<<endl;
}
}
如果有人能解释为什么会这样,我将不胜感激。谢谢!
这个条件
if(isPalindrome==false && (s.empty() && q.empty()))
永远不会等于 true。:)
因为你在循环中将 isPalindrome 设置为 false 而没有从堆栈和队列中弹出相应的元素
if (s.top() != q.front())
{
isPalindrome = false;
}
因此程序控制总是传递给else语句
else
{
cout<<"Is a palindrome."<<endl;
}
而不是if语句中的错误条件
if(isPalindrome==false && (s.empty() && q.empty()))
你可以这样写
if (isPalindrome == false )
或者干脆
if ( !isPalindrome )
或者您可以完全删除变量 isPalindrome 并使用条件
if ( s.empty() && q.empty() )
或更简单
if ( s.empty() )
程序可以这样看
#include <iostream>
#include <stack>
#include <queue>
#include <string>
int main()
{
while ( true )
{
std::string letters;
std::cout << "Please enter a string (Enter - exit): ";
std::getline( std::cin, letters );
if ( letters.empty() ) break;
std::stack<char>
s( std::stack<char>::container_type( letters.begin(), letters.end() ) );
std::queue<char>
q( std::queue<char>::container_type( letters.begin(), letters.end() ) );
while ( !s.empty() && s.top() == q.front() )
{
s.pop();
q.pop();
}
if ( s.empty() ) std::cout << "The string is a palindrome" << std::endl;
else std::cout << "The string is not a palindrome" << std::endl;
}
return 0;
}
在最后的 if
语句中,您不必要地检查 stack/queue 是否为空,因为如果上面的 isPalindrome
为假,它们很可能不会为空。
另外,看起来你想把
cout<<"True or false: "<<isPalindrome<<endl;
在 if
语句之前,以便它始终运行。
好吧,对于初学者来说,你推整数而不是字符。要推送字符串中的字符,请使用 q.push(letters[i])
而不是 q.push(i)
.
你也可以去掉栈,把一半的字符串压入队列,然后和另一半比较。像这样:
#include <iostream>
#include <queue>
#include <string>
using namespace std;
int main (void)
{
queue <char> q;
string letter;
int length;
cout<<"Please enter a series of characters."<<endl;
getline (cin, letter);
bool isPalindrome = false;
if (letters.size() > 0)
{
int length = letter.size() / 2;
for (int i=0; i<length; i++)
{
q.push(letters[i]);
}
isPalindrome = true;
for (int i = 1; i <= length && isPalindrome; ++i)
{
isPalindrome = q.front() == letters[letters.size() - i];
q.pop();
}
}
if(!isPalindrome)
{
cout<<"Is not a palindrome."<<endl;
}
else
{
cout<<"Is a palindrome."<<endl;
}
return 0;
}
或者您实际上可以避免为这样一个简单的任务使用繁重的数据结构,而使用一个简单的循环来执行此操作:
bool isPalindrome = false;
int len = letters.size();
if (len > 0)
{
isPalindrome = true;
for (int i = 0; i < len / 2 && isPalindrome; ++i)
{
isPalindrome = letters[i] == letters[len - i - 1];
}
}
#include<iostream>
#include <stack>
#include<queue>
#include<string>
using namespace std;
int main() {
queue<char> q;
stack <char> s;
string name;
int count = 0;
cout << "Please enter a name " << endl;
cin >> name;
for (int i = 0; i < name.size(); i++) {
q.push(name[i]);
s.push(name[i]);
}
bool check = true;
if (!q.empty() && !s.empty() && check){
if (s.top() == q.front()) {
q.pop();
s.pop();
cout << " It is a palindrome " << endl;
}
else
cout << " It's not a palindrome" << endl;
}
system("pause");
return 0;
}