我必须使用堆栈和队列来检查它是否是我的作业的txt文件中的回文。
************ Txt文件**************
我说过你永远不会说"永远不会说永远不会"?你说我做了。
我说过你永远不会说"永远不会"?
你很高兴你是国王吗? 金,你很高兴你是国王吗?落叶后落叶。
妈妈说,"你做什么?" - 你做妈妈说的话。
妈妈说,"你做什么?" - 你做妈妈做的事。
你知道,我没有为你做过什么,因为我很少认识你。
你知道,我没有为你做过什么,因为我很少认识你。
第一夫人统治国家。
埃舍尔,画手,画画。你可以吞下一只燕子,不能吗?
第一夫人统治国家,并陈述规则:"女士第一"。
他们相信自己很幸福是有福的。
你可以吞下一只燕子,但是你可以吞下笼子,对吗?
关注自己的事业:拥有自己的想法。
骑马,骑马,骑马,骑马,骑马,骑马,骑马!
咔哒咔哒,嘎嘎嘎嘎,嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎。
关注自己的事业。
一个人,一个人一个人!
埃舍尔伸出双手,画了埃舍尔。假装每行之间没有空格。 因此,在第一行之后,没有空行,第二句话如下。
我使用istringstream在第一行停止,但输出有错误。由于某种原因,每个句子的最后一个单词打印出两次。
这是我的代码,
void getData(Stack<string> &s, Queue<string> &q)
{
ifstream readFile;
string temp;
string temp1;
Stack<string> a[24];
Queue<string> b[24];
int j = 0;
//int b = 0;
readFile.open("test_word_plndrms.txt");
if(!readFile)
{
cout << "Error opening the file" << endl;
exit(1);
}
else {
while(!readFile.eof()) {
getline(readFile, temp);
for (size_t i = 0; i < temp.length(); ++i) {
if (ispunct(temp[i]))
temp.erase(i--, 1);
if(isupper(temp[i]))
temp[i] = tolower(temp[i]);
}
istringstream ss(temp);
while(ss) {
ss >> temp1;
cout << temp1 << endl;
a[j].push(temp1);
b[j].enqueue(temp1);
}
j++;
}
}
}
这是我的输出,
做 一世 说 您 决不 说 决不 说 决不 您 说 一世 没有 没有 没有 一世 说 您 决不 说 决不 决不 是 您 高兴 您 是 王 王 王 是 您 高兴 您 是 王 王 秋季 树叶 后 树叶 秋季 秋季 说 妈妈 什么 做 您 做 您 做 什么 妈妈 说 说 说 妈妈 什么 做 您 做 您 做 什么 妈妈 不 不 您 知道 一世 没有 小 对于 您 对于 小 没有 一世 知道 您 您 您 知道 一世 没有 小 对于 您 以来 小 没有 一世 知道 您 您 第一 女士们 规则 该 州 州 埃舍尔 画画 手 德鲁 手 画画 画画 您 能够 笼 一个 吞 斜面 您 您 第一 女士们 规则 该 州 和 州 该 规则 女士们 第一 第一 幸福 是 他们 那 相信 他们 是 幸福 幸福 您 能够 笼 一个 吞 斜面 您 但 您 斜面 吞 一个 笼 能够 您 您 心神 您的 拥有 商业 拥有 您的 心神 心神 骑着车 和 骑着车 和 骑着车 和 骑着车 和 骑着车 和 骑着车 和 骑着车 骑着车 哒 和 哼 和 紧缩 和 紧缩 和 哼 和 哒 哒 心神 您的 拥有 商业 商业 所有 对于 一 和 一 对于 所有 所有 埃舍尔 画画 手 德鲁 手 画画 埃舍尔 埃舍尔 程序以退出代码结束:0
我要做的是阅读第一行,并将每个单词如&#34;&#34; &#34; I&#34; &#34;说&#34; &#34;你&#34; &#34;从未&#34; &#34;说&#34; &#34;从未&#34; &#34;说&#34; &#34;从未&#34; &#34;你&#34; &#34;说&#34; &#34; I&#34; &#34;做&#34;并将它们推送到堆栈并排队。 然后,弹出每个字符串,如果弹出的字符串不同,它不是回文句子,如果全部相同,那就是回文句子。
有人可以给我这个家庭作业的任何建议吗?谢谢。
答案 0 :(得分:3)
它打印最后一个单词两次的原因是因为声明:
while(ss)
{
...
}
while循环需要额外的循环,因为ss仍然有效。 您可以清除它并检查temp1是否为空。
while (ss)
{
ss >> temp1;
if (temp1.empty())
{
break;
}
cout << temp1 << endl;
a[j].push(temp1);
b[j].enqueue(temp1);
temp1.clear();
}
答案 1 :(得分:1)
你的while
循环执行了一个额外的循环,因为它错误地检查是否存在CURRENT字(已经在前一个循环中打印过)。它应该检查是否存在要打印的NEXT字。因此,我改变了while
循环的条件。
void getData (Stack<string> &s, Queue<string> &q) {
ifstream readFile;
string temp;
string temp1;
Stack<string> a[24];
Queue<string> b[24];
int j = 0;
readFile.open("test_word_plndrms.txt");
if (!readFile) {
cout << "Error opening the file" << endl;
exit(1);
}
else {
cout << "Reading file" << endl << endl;
while (!readFile.eof()) {
getline(readFile, temp);
for (size_t i = 0; i < temp.length(); ++i) {
if (ispunct(temp[i])) {
temp.erase(i--, 1);
}
if (isupper(temp[i])) {
temp[i] = tolower(temp[i]);
}
}
cout << "Finished reading line #" << j+1 << ":" << endl;
istringstream ss(temp);
while (ss.peek() != EOF) {
ss >> temp1;
cout << temp1 << ' ';
a[j].push(temp1);
b[j].enqueue(temp1);
}
cout << endl << endl;
j++;
}
}
}