目标是有两个字符串,其中的一个退格按钮表示为<
。但是,两个带有不同位置的退格按钮的字符串的输出应该相等。
对于InputsEqual
函数,当看到退格按钮时,它基本上将顶部项目弹出堆栈。
我使用其他文件进行了测试,但仍然无法正常工作。您可以查看此代码吗?
#include <iostream>
#include <cstring>
#include <string>
#include <stack>
using namespace std;
bool EqualStacks(stack<char> a, stack<char> b);
bool InputsEqual(string inputA, string inputB);
int main()
{
string inputA = "abcde<<";
string inputB = "abcd<e<";
if(InputsEqual(inputA,inputB))
{
cout << "Inputs Equal.\n";
}
else
{
cout << "Inputs are NOT Equal.\n";
}
return 0;
}
bool EqualStack(stack<char> a, stack<char> b)
{
for(int i = 0; i < a.size(); i++)
{
if(a.top() == b.top())
{
a.pop();
b.pop();
}
}
return (a.empty() && b.empty()) ? true:false;
}
//If both stacks are empty, they equal
bool InputsEqual(string inputA,string inputB)
{
stack<char> aStack;
stack<char> bStack;
// string inputA;
// cout << "Please enter a string. Press < if you want to delete something"
// cin >> inputA;
for(int i = 0 ; i < inputA.length() + 1; i++)
{
if(inputA[i] != '\0')
{
if(inputA[i] != '<')
{
aStack.push(inputA[i]);
}
else if(!aStack.empty())
{
aStack.pop();
}
else
{
aStack.pop();
}
}
}
for(int i = 0 ; i < inputB.length() + 1; i++)
{
if(inputB[i] != '\0')
{
if(inputB[i] != '<')
{
bStack.push(inputA[i]);
}
else if(!bStack.empty())
{
bStack.pop();
}
else
{
bStack.pop();
}
}
}
return (EqualStack(aStack,bStack));
}
//输出:字符串不相等
答案 0 :(得分:1)
您有两个特定的代码破解问题。
第一个是在InputsEqual()中循环的第二个副本中,将inputA [i]的值压入应该表示inputB [i]的位置。
bStack.push(inputA[i]); // should be inputB!
第二,在EqualStack()中,您在每次迭代时都将a.size()与i进行比较。问题是,如果存在匹配项,您还可以通过调用a.pop()来缩小堆栈。这会导致for循环提前中止,从而使堆栈变为非空。
一种快速解决方案是将循环更改为在a为空时结束,如下所示:
for(int i = 0; !a.empty(); i++) // fixed
代替:
for(int i = 0; i < a.size(); i++) // broken
我还想指出一些其他可以快速清除的内容:
return (a.empty() && b.empty()) ? true:false; // redundant
return a.empty() && b.empty(); // better
和:
else if(!aStack.empty())
{
aStack.pop(); // you call it if the stack is empty
}
else
{
aStack.pop(); // and if its not, which is redundant!
}
据我所知,pop()似乎对于空容器是未定义的,因此在调用它之前检查堆栈是否为空是一种好习惯,只是尾随pop()语句是不必要的!只需将其清除,就可以了。
最后,如果仅在循环中检查inputAorB.length()而不是length()+ 1,则可以避免inputAorB [i]!='\ 0',因此:
for(int i = 0 ; i < inputA.length() + 1; i++)
{
if(inputA[i] != '\0')
{
if(inputA[i] != '<')
{
aStack.push(inputA[i]);
}
else if(!aStack.empty())
{
aStack.pop();
}
}
}
可以缩写为:
for(int i = 0 ; i < inputA.length(); i++)
{
if(inputA[i] != '<')
{
aStack.push(inputA[i]);
}
else if(!aStack.empty())
{
aStack.pop();
}
}
可能会有更多清理工作,但我认为我只是指出了更明显的清理工作。祝您项目顺利!
答案 1 :(得分:0)
您将永远不会比较堆栈的所有元素,而循环$fruit = ["banana", "apple", "berry"];
$names = ["Tom", "Jack", "Arnold"];
$merge = [];
for ($i = 0; $i < sizeof($fruit); $i++)
{
$merge[$fruit[$i]] = $names[$i];
}
print_r($merge);
会在每次迭代中求值,但是您每次迭代都会更改i < a.size()
的大小。因此,每次迭代的比较如下:
因此经过2次比较后它将停止。
因此,在循环结束时,a
将返回return (a.empty() && b.empty()) ? true:false;
,因为堆栈中仍然有元素。
可以使用while循环代替for循环:
false