设L是如下定义的语言:
- 单词由a的字符串组成,后跟b。
- a的数量总是等于b的数量。
- 属于L的单词的例子有:ab,aabb,aaabbb等......
醇>测试单词w是否属于这种语言的一种方法是使用堆栈来检查a的数量是否平衡了b的数量。
这就是我要做的事情:
请参阅下面我实施的计划:
#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而明显排除了不相等的计数。
此外,我正在使用堆栈来比较计数,这一切都很好,但我并没有真正检查字符串是否与模式匹配。在我看来,我会使用检查模式的方法,但问题只是想看看是否平衡我认为这种方法不会很糟糕。
对于如何处理这个问题的任何建议都将不胜感激。
由于
答案 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;
}