使用向量作为堆栈的实现检查字符串是否包含由哈希符号分隔的回文

Check if a string contains palindromes separated by a hash symbol using a vector as an implementation of the stack

我必须编写一个 bool mirrored() 函数,如果输入满足以下条件,该函数必须 return true

The string is mirrored if it contains palindrome substrings separated by one (and only one) hash symbol, and if all the palindromes are correct.

所以它应该 return true 以下:

#####abc#cba##a#aabc#cba

false 用于以下内容:

abcabc#cvabc#cbaa#aaab#bac##c

这是我关于使用堆栈相关函数的第一个练习,我在使用以下代码时遇到困难:

bool isMirrored(){
    vector<char> stack;
    char s;
    bool hashSymbol = false;
    while(cin >> s){
        if(s=='#'){
            hashSymbol = true;
            while(hashSymbol && !stack.empty()){
                if(s==stack.back()){
                    stack.pop_back();
                }
                if(stack.empty()){
                    hashSymbol=false;
                }
                else{
                    return false;
                }
            }
        }
        stack.push_back(s);
    }
    return true;
}

我的计划是当 # 不存在时,它用字符加载堆栈,当找到 # 时,我的算法进入“检查模式”(因此切换 hashSymbol 变量到 true) 并检查堆栈的最顶层元素是否等于下一个字符。如果是,则它检查下一个并丢弃堆栈的最顶层元素。如果字符不匹配,则函数 returns false。当堆栈为空时,算法应再次进入“输入模式”(hashSymbol 切换为 false)并重新开始循环。如果函数没有 return false 并且输入结束,那么它必须 return true.

我的问题是我不知道如何移动到输入中的下一个字符。当它找到 # 时,它进入内部 while 语句,而 s 仍然是 # 字符。

我想到了(至少乍一看)另一个可能的更简单的解决方案,但我仍然不知道如何在找到 # 时移动到输入中的下一个字符。

vector<char> stack;
char s;
while(cin >> s){
    if(s!='#'){
        stack.push_back(s);
    }
    else{
        if(!stack.empty()){
            [this is where I would check for equal characters]
        }
        else{
            return true;
        }
    }
}

return stack.empty();

第一个版本的一些提示。

while(hashSymbol && !stack.empty()){

多此一举。一次只检查一个字符。

stack.push_back(s);

也将“#”压入堆栈。

我认为您可以更轻松地调整第二个版本,而不是更正第一个版本。

你离解决方案不远了..