c++ 有没有一种方法可以在不弹出整个堆栈的情况下检查堆栈中是否已经存在某个元素?

ippsafx7  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(197)

这个问题的目标是从字符串中提取所有的元音、数字和符号,并将每个char/int放到它们各自的堆栈中(元音堆栈、数字堆栈和符号堆栈),在迭代字符串并提取所需内容之后,我必须根据字符串中最后一个符号的内容,对堆栈中的前两位数字(字符串中的后两位数字)进行算术运算。
约束之一是堆栈中不能有重复项;我处理这个约束的方法是,让一个向量包含已经使用过的元音、数字和符号,每次我通过检查字符串的当前字符是否是元音、数字或符号的逻辑时,我都会检查该字符是否已经“使用过”(aka present in the used vector)。然而,我刚刚被告知我们不允许在这个赋值语句中使用向量,所以我真的很困惑。我想创建一个'find'方法来搜索堆栈,但这需要弹出整个堆栈,我不认为这是一个选项,因为我必须显示和处理数字和符号堆栈中的项目。此外,在标题中指定我只能使用push(),pop(),isEmpty(),peek(),isFull()。
下面是负责检查和添加到堆栈的代码:

// traverse through the string
    for (int i = 0; i < toParse.length(); i++)
    {

        // if the char is a vowel, add it to the vowel stack (if it's not already in the stack)
        if(isVowel(toParse[i]) == true)
        {

            if(find(used.begin(), used.end(), tolower(toParse[i])) == used.end())
            {
                vowels.push(tolower(toParse[i]));
                used.push_back(tolower(toParse[i]));
            }

        }
        
        // if the char is a digit, add it to the digit stack (if it's not already there)
        if(isdigit(toParse[i]))
        {

            if(find(used.begin(), used.end(), toParse[i]) == used.end() )
            {

                digits.push(atoi(&toParse[i]));
                used.push_back(toParse[i]);
            }

        }

        // if the char is a symbol, add it to the symbol stack regardless of whether it's   already there or not
        if(isSymbol(toParse[i]))
        {

            if(find(used.begin(), used.end(), toParse[i]) == used.end() )
            {

                symbols.push(toParse[i]);
                used.push_back(toParse[i]);

            }

        }

    }

谢谢你的阅读;我也不指望任何人做我的家庭作业,我只是想在正确的方向上得到一点指导!
编辑1:按照要求,以下是我的任务的确切文本:[1]:https://i.stack.imgur.com/crM1P.png

vc6uscn9

vc6uscn91#

你可以把所有的元素从一个栈弹出到另一个栈中,然后检查每个值。这会颠倒栈的顺序,所以你需要在原来的栈中重复这个过程。这不是最优雅的解决方案,但可能会达到你的目的。
举例说明我的意思:

while (!stack1.isEmpty())
{
     var value = stack1.pop();
     // perform some logic or check on the value
     stack2.push(value);
}

// To restore the original stack in the original order
while (!stack2.isEmpty())
{
     stack1.push(stack2.pop());
}

另一种方法是处理输入字符串并删除重复项,然后将其拆分并push到各自的堆栈中。这样你就不必检查堆栈中已经存在的内容,因为你已经删除了所有重复项并保证每个字符只显示一次。我不确定你的赋值语句有什么限制,但下面的链接可以让你开始使用这种方法:Remove duplicates in string algorithm

相关问题