السلام عليكم ,,
لمن يعرف ما هو الـ Palindrome ,, فقد قمت بكتابة مثال للتحقق إذا كانت الجملة عبارة عن Palindrome أم لا ,,
لمن لا يعرف ما أتكلم عنه ,, خذ الجملة التالية مثلاً :
I am, Who Am I ?
المقصود هنا أنه إذا كان بالإمكان قراءة الكلمات من اليمين إلى اليسار و من اليسار إلى اليمين (h) فهو Palindrome ,,
مع ملاحظة أن الكود يهتم بالكلمات و ليس بالأحرف ,, و المعنى أن الكلمات لو أعيد ترتيبها من اليسار إلى اليمين أو من اليمين إلى اليسار فستعطي نفس الجملة ,,
هناك نوع آخر من Palindrome و هو يهتم إذا كانت أحرف الجملة من اليمين إلى اليسار يمكن أن تقرأ من اليسار لليمين ,, و التحقق طبعاً يكون أسهل من التحقق من المثال الذي في الأعلى ,, مثال :
POP
فهذه الكلمة يمكن قرائتها من اليمين إلى اليسار و من اليسار إلى اليمين و لكن هذا النوع ليس موضع اهتمامنا ,,
-------------------------------------------------------------------------------------------------------
من مميزات الكود أنه لا يهتم إذا كانت الأحرف صغيرة أو كبيرة ,, و لا يهتم بعلامات الترقيم كالفاصلة و النقطة و غيرها ,, فقط يهتم بالأحرف و apostrophe s ,,
apostrophe s : هي s الملكية مثالها ,,
We are God's Creation.
كلمة God's يعتبرها البرنامج كلمة واحدة و لا يعتبر s الملكية علامة ترقيم ,,
المهم لنذهب للاطلاع على الكود ,,
قمت بتصميم دالة تستقبل نص للتحقق إذا كانت الجملة Palindrome أم لا ,, و تقوم بإرجاع true أو false :
bool IsPal ( string Str ){
string Word;
queue <string> PalQ;
stack <string> PalS;
int Counter = 0;
for ( unsigned int I = 0; I < Str.length(); I++ ){
if ( isalpha ( Str[ I ] ) && isupper ( Str[ I ] ) )
Str[ I ] = tolower ( Str[ I ] );
}
while ( Str[ Counter ] ){
Word = "";
if ( !(isalpha ( Str [ Counter ] )) && (Str [ Counter ] != '\'') ){
Counter++;
continue;
}
while ( (isalpha ( Str [ Counter ] )) || (Str [ Counter ] == '\'') ){
Word += Str[ Counter ];
Counter++;
}
PalQ.push ( Word );
PalS.push ( Word );
}
unsigned int WordsCount = PalQ.size();
// Fixed by Shreef.
for ( unsigned int I = 0; I < WordsCount; I++ ){
if ( PalQ.front() != PalS.top() )
return false;
PalQ.pop(); PalS.pop();
}
return true;
}و الدالة تستعمل المكتبات التالية ,,
#include <stack> #include <queue> #include <string> #include <cctype>
طبعاً شرح خفيف للدالة سيكون كالتالي ,,
for ( unsigned int I = 0; I < Str.length(); I++ ){
if ( isalpha ( Str[ I ] ) && isupper ( Str[ I ] ) )
Str[ I ] = tolower ( Str[ I ] );
}
هنا يتم تحويل جميع الأحرف الكبيرة إلى أحرف صغيرة في النص الذي تم تمريره ,, النص الأصلي لن يتأثر لأننا مررنا النص بالقيمة و ليس بالمرجع في الدالة ,,
الحلقة ستمر على كل حرف و ترى إذا كان حرفاً و كان Capital فسوف يتم تحويله إلى Small ,,
while ( Str[ Counter ] ){
Word = "";
if ( !(isalpha ( Str [ Counter ] )) && (Str [ Counter ] != '\'') ){
Counter++;
continue;
}
while ( (isalpha ( Str [ Counter ] )) || (Str [ Counter ] == '\'') ){
Word += Str[ Counter ];
Counter++;
}
PalQ.push ( Word );
PalS.push ( Word );
}الحلقة هنا ستتكرر مادام النص لم يصل إلى نهايته ,, و الملاحظ أنه في if الأولى إذا لم يكن الحرف حرفاً هجائياً أو apostrophe s فسوف تزيد الحلقة المتغير Counter و تعيد تكرار الحلقة بالكلمة المحجوزة continue ,,
أما إذا كان حرفاً هجائياً أو apostrophe s فسوف تقوم الحلقة بتكوين الكلمة ثم إضافتها للـ Stack و الـ Queue اللذان تم تعريفها سابقاً ,,
for ( unsigned int I = 0; I < PalQ.size(); I++ ){
if ( PalQ.front() != PalS.top() )
return false;
PalQ.pop(); PalS.pop();
}هنا سوف يتم التحقق من غرض الدالة ,, عن طريق الـ Stack و الـ Queue ,,
---------------------------------------------------------------------------------------
في المرفقات ستجد الدالة مع مثال لها عن كيفية تطبيقها ,,
إذا كان لديك أي استفسار أو تعديل على الكود فلا تتردد
----------------------------------------------------------------------------------------
تحديث ...
اكتشف الأخ Shreef bug في البرنامج ,,
الـBug كانت في for loop
الأخيرة و تم إصلاحها
تحياتي ,,


