使用堆栈查看两个字符串是否相等

时间:2019-03-03 05:57:44

标签: c++ stack lifo

目标是有两个字符串,其中的一个退格按钮表示为<。但是,两个带有不同位置的退格按钮的字符串的输出应该相等。

对于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));
} 

//输出:字符串不相等

2 个答案:

答案 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()的大小。因此,每次迭代的比较如下:

  • 0 <3
  • 1 <2
  • 2 <2

因此经过2次比较后它将停止。

因此,在循环结束时,a将返回return (a.empty() && b.empty()) ? true:false;,因为堆栈中仍然有元素。

可以使用while循环代替for循环:

false