אלגוריתם

erez2010

New member
אלגוריתם

שלום רב מישהו אולי בבקשה יכול לעזור לי ולהגיד לי מהו האלגוריתם שבודק תקינות של סוגריים () ושל {} ביחד כלומר {(())} תקין )(}{ לא תקין תודה רבה
 

פרסאוס

New member
לכל תו יש תו נגדי בסדר מסויים

אני מאמין שאתה יכול להמשיך מפה.
 

BravoMan

Active member
עוד רמז:

אחד הפתרונות הנפוצים לתרגיל הזה הוא שימוש במחסנית, כלומר LIFO.
 

erez2010

New member
ידוע

ידוע לי שהמימוש הוא במחסנית אבל אני לא מצליח למצוא פתרון בעצמי אם תוכלו לתת לי אלגוריתם אני מאוד אודה לכם
 

nocgod

New member
אתה מתכוון אם נוכל לתת לך פיתרון...

תחפש באינטרנט פתרונות, לדעתי חיבור מילים כמו check parentheses order algorithm יתן לך פיתרון
לדעתי אתה אפילו לא ניסית לפתור כי אחרת היית מציג לנו את זה...
הפיתרון לדבר כזה הוא מאוד פשוט במיוחד אחרי מה שאמרו לך פרסאוס ובראוו
 

erez2010

New member
דווקא ניסיתי הנה

char str[40],*pstr;
int i,len,flag=0,sm=0,sr=0;
scanf("%s",str);
len=strlen(str);
pstr=str;
for(i=0;i<len;i++)
if((*(pstr+i)!='{') && (*(pstr+i)!='}') && (*(pstr+i)!='(') && (*(pstr+i)!=')'))
flag=1;

if(flag==1)
printf("\n\n rong chars");

for(i=0;i<len;i++)
{
if(*(pstr+i)=='{')
sm++;
if(*(pstr+i)=='}' && sr==0)
sm--;
if(*(pstr+i)=='(')
sr++;
if(*(pstr+i)==')' && sm==0)
sr--;
}
if(sm==0 && sr==0)
printf("good");
else
printf("bad");
}

פשוט זה לא הולך תודה רבה על ההכונה באינטרנט
 

nocgod

New member
אני אתחיל בפירמוט הקוד שלך שנראה לא משהו בכלל

תגיד לי מורידים לכם ציון עם רווחים? או על ירידות שורה?

char str[40], *pstr;
int i, len, flag=0, sm=0, sr=0;

scanf("%s" ,str);
len = strlen(str);
pstr = str;

for(i=0;i<len;i++)
{
if( (*(pstr + i) != '{' ) &&
(*(pstr + i) != '}' ) &&
(*(pstr + i) != '(' ) &&
(*(pstr + i) != ')' ) )
{
flag=1;
}
}

if(flag==1)
{
printf("\n\n rong chars");
}

for(i=0;i<len;i++)
{
if(*(pstr+i)=='{')
{
sm++;
}
if(*(pstr+i)=='}' && sr==0)
{
sm--;
}
if(*(pstr+i)=='(')
{
sr++;
}
if(*(pstr+i)==')' && sm==0)
{
sr--;
}
}

if(sm==0 && sr==0)
{
printf("good");
}
else
{
printf("bad");
}


נמשיך בשאלה: איפה השימוש פה במחסנית?
ונוסיף עוד משהו: חוק הסוגריים במתמטיקה אומר דבר מאוד פשוט אם יש 2 סטים של סוגריים הם יכולים להופיע ב3 דרכים בלבד כך שיהיו תקינים
[] ()
() []
[ () ]

כמובן בלי הגבלת כלליות, ולכן אם סט אחד התחיל ובתוכו התחיל עוד סט הסט הפנימי חייב להסתיים לפני הסט החיצוני
 

BravoMan

Active member
הבעיה בפתרון שלך, שהוא לא יכול להתחשב במצב

שבו יש זוג סוגריים מסוג אחד בתוך זוג סוגריים מסוג אחר, כלומר במצב כזה: ({})

זה בדיוק המקום שבו נכנסת המחסנית, שמאפשרת לך לדעת איזה סוגר "סוגר" אמור להיות הבא בתור, ומספיק שנתקלים באחד לא במקום, אפשר להפסיק לרוץ ולהכריז על מחרוזת שגויה.

אגב, אתה יוצר קוד מכוער ומסובך יותר לשווה כשאתה משתמש במצביע נוסף (pstr) וחיבור מצביעים (pstr + i).
אין בקוד שלך שום דבר שמצריך את זה, ויכולת פשוט לכתוב [str[i.
עוד לא ראיתי מקום לימודים שלא מוריד ציון על משתנים מיותרים!
 
למעלה