使用堆栈

时间:2016-03-28 17:23:18

标签: c++ stack

  

设L是如下定义的语言:

     
      
  1. 单词由a的字符串组成,后跟b。
  2.   
  3. a的数量总是等于b的数量。
  4.   
  5. 属于L的单词的例子有:ab,aabb,aaabbb等......
  6.         

    测试单词w是否属于这种语言的一种方法是使用堆栈来检查a的数量是否平衡了b的数量。

这就是我要做的事情:

  1. 检查长度字符串是否均匀
  2. 如果是将功能发送到功能
  3. 将长度除以2并将a推入堆栈
  4. 反转字符串
  5. 将长度除以2并将b推入堆栈
  6. 虽然堆栈不是空的,但每个都存储了每个
  7. 的计数
  8. 比较计数,如果它们相等则返回0或如果不返回1
  9. 请参阅下面我实施的计划:

    #include <iostream>
    #include <string>
    #include <stack>
    #include <algorithm>
    
    using namespace std;
    
    int count1 = 0;
    int count2 = 0;
    
    bool isInLanguageL (string w);
    
    int main()
    
    {
        string input;
    
        cout << "Input any string; ";
        getline(cin,input);
    
        if (input.length() % 2 != 0)
            cout <<"Pattern entered does not match the language ";
        else
            isInLanguageL(input);
    
        return 0;
    }
    
    bool isInLanguageL (string w)
    {
        stack<string> word1, word2;
        string a, b;
    
            for (unsigned i = 0; i < w.length()/2; i++)
        {
               a = w.at(i);
               word1.push(a);
    
        }
    
        reverse(w.begin(), w.end());
    
        for (unsigned i = 0; i < w.length()/2; i++)
        {
               b = w.at(i);
               word2.push(b);
    
        }
    
    
    while(!word1.empty() && !word2.empty())
    {
    
    
        word1.pop();
        count1 = count1++;
        word2.pop();
        count2 = count2++;
    
    }
    
    if(count1 == count2)
        return true;
    else
        return false;
    
    }
    

    我遇到的问题是尽管它正常工作我会很感激并且对它有意见,因为我觉得它们可能是处理字符串的另一种方法,尽管在绞尽脑汁之后这是我能想到的最好的解决方案。

    对我来说有点愚蠢的是我在比较两个堆栈的计数,因为它很明显,因为我不允许奇数传递给计数永远是相等,这也是由于每次迭代中除以2而明显排除了不相等的计数。

    此外,我正在使用堆栈来比较计数,这一切都很好,但我并没有真正检查字符串是否与模式匹配。在我看来,我会使用检查模式的方法,但问题只是想看看是否平衡我认为这种方法不会很糟糕。

    对于如何处理这个问题的任何建议都将不胜感激。

    由于

3 个答案:

答案 0 :(得分:2)

SO实际上不是“建议”或“意见”的网站。也就是说,你不需要大量的堆栈开销就可以做到这一点。

bool match(std::string const& str)
{
    if (str.size() % 2) return false;

    int i = 0;

    auto beg = std::begin(str);
    for (; beg != std::end(str); ++beg)
    {
        if (*beg != 'a') break;
        ++i;
    }

    int j = 0;
    for (; beg != std::end(str); ++beg)
    {
        if (*beg != 'b') break;
        ++j;
    }

    return i == j;
}

答案 1 :(得分:1)

我这样做,排成一行:

bool is_correct = (input.length() % 2 == 0) && std::all_of(input.cbegin(), input.cbegin() + input.length()/2,[](const char letter){return letter=='a';}) &&
      std::all_of(input.cbegin() + input.length()/2, input.cend(),[](const char letter){return letter=='b';});

这样整个程序可能很小:

int main() {
  std::string input;
  std::cout << "Input any string; ";
  std::getline(std::cin,input);
  bool is_correct = (input.length() % 2 == 0) && std::all_of(input.cbegin(), input.cbegin() + input.length()/2,[](const char letter){return letter=='a';}) &&
      std::all_of(input.cbegin() + input.length()/2, input.cend(),[](const char letter){return letter=='b';});
  if (is_correct) std::cout << "Pattern entered does match the language\n";
  else  std::cout << "Pattern entered does not match the language\n"; 
  return 0;
}

请注意,不需要任何stack。当然,这是一个品味问题,有些人可能更喜欢冗长而不是尺寸。

答案 2 :(得分:1)

使用Khalil Khalaf的想法:

bool isInLanguage(string w)
{
  stack <char> charStack;

  for (unsigned int i = 0; i < w.length(); i++)
  {
    if (w[i] == 'a' && i > 0) // skip fisrt character if it is an a
      charStack.push(w[i]);
    else if (w[i] == 'b')
    {
      if (charStack.size() > 0)
        charStack.pop();
      else // is something like abababababa
        return false;
    }
  }

// Finally, the stack should be empty
return charStack.size() == 0;
}

快速测试的输出示例: enter image description here