درخواست راهنمایی

پرسیده شده
فعالیت 1427 روز پیش
دیده شده 963 بار
0

سلام استاد من این کد رو نوشتم میخوام اشکالش رو بگیرم. سوالش این هست

رشته‌ای شامل کاراکترهای (، )، {، }، [، ] داریم. می‌خواهیم ببینیم پرانتزگذاری در این رشته معتبر است یا خیر.

این رشته در صورتی معتبر است که:

  1. هر پرانتز بازی با پرانتز مربوط به خودش بسته شود.
  2. پرانتزهای باز با ترتیب درستی بسته شوند.

ورودی

در یک خط از ورودی استاندارد، رشته‌ی موردنظر وارد می‌شود. توجه داشته باشید که این رشته می‌تواند خالی باشد.

خروجی

در یک خط از خروجی استاندارد، در صورتی که پرانتزگذاری به درستی صورت گرفته است، YES و در غیر این صورت، NO را چاپ کنید.

<?php
$str=readline();
$i=0;
$stack=array();
$top=-1;
$flag=true;
while ($i<strlen($str)){
    if ($str[$i]=='(' || $str[$i]=='{' ||$str[$i]=='[')
        {
            $top++;
            $stack[$top]=$str[$i];
        }
        else {
            if ($top==-1) {echo 'NO'; $flag=false;break; }
        if (($str[$i]==')' && $stack[$top]=='(') ||($str[$i]=='}' && $stack[$top]=='{') ||($str[$i]==']' && $stack[$top]=='['))
                $top--;
            else{
                echo 'NO'; $flag=false;break; }
            
        }
        $i++;
}
if ($flag==true && $top==-1)
    echo 'YES';
else
    echo 'NO';

وقتی ورودی (( میدم باید جواب noباشه ولی به جای یک no دوتا چاپ میکنه اگر میشه اشکالش رو بهم بگید ممنون

فایل پیوست

ایران
ایران

20 خرداد 99

0
حذف شده

سلام

متاسفانه فرصت نکردم الان کد رو بررسی کنم ولی به صورت کلی برای حل این مسئله استفاده از استک یه انتخاب خوبه و درسته.

اگر دو تا no چاپ میشه خیلی راحت مقدار شرط ها رو var_dump کن ببین چرا داخل اون شرط ها مقدار no چاپ میشه و مقادیر متغیر ها رو بررسی کن. اصطلاها باید trace کنی کدت رو و ببینی چه اتفاقی می افته دقیق ...

فایل پیوست

لقمان آوند

توسط

لقمان آوند

20 خرداد 99

0
حذف شده

سلام کسب و کار، واقعا یاد ساختمان داده به خیر:-)

یه نگاه انداختم بنظرم خودتم  میدونی فقط یه خورده احتمالا خسته بودی دقت نکردی یه بار  بررسی کن ولی با دیباگر قلم و کاغذ  خیلی لذت بخشه  حالامنم یه بررسی کردم پس بریم سراغ کد شما :

$top=-1;
$flag=true;

ورودی هم (( دو تا پرانتز بسته 

حلقه(i<strlen($str$بررسی میکنه  میگه  طول رشته از ۰ بزرگتره؟ بله پس میاد داخل حلقه  حالا چون شرط اول،  حداقل یکی از اینایی که مشخص کردین نبود میره واسه نقضش و top تغییری نمی کنه  و برابر با منفی ۱ باقی میمونه پس :

 if ($top==-۱) { // شرط درسته پس میاد داخل 
        echo 'NO';// اینجا اولین نه چاپ میشه
        $flag=false; //  اینجا پرچم شمااز1 به 0 تغییر میکنه
        break;// واینجاهم از حلقه میپره بیرون
 }

حالا از حلقه زده بیرون و مقدار پرچم false شده و بالای پشته هم همون منفی ۱ میریم واسه قطعه اخر

 if($flag==true && $top==-۱)// اینجا و(&&) گزاشتی پس چون پرچم مقدار دیگه ای داره بله چاپ نمیشه
    echo 'YES';
 else
    echo 'NO'; //  و برای بار دوم هم میگن رفته گلاب بیاره وباز هم می گوید نه 

تصحیحش با شما :-)

ممنون  بابت این سوال  خاطره انگیز

فایل پیوست

مهرداد

توسط

مهرداد

20 خرداد 99

0
حذف شده

سلام استاد. ممنون بابت وقتی که گذاشتید. الان با این ورودی  [) امتحان کردم باز هم به خطا خوردم دوتا NO  چاپ کرد و برای ورودی (( هم YES چاپ کرد فکر کنم حسابی خسته ام.-)

فایل پیوست

ایران

توسط

ایران

21 خرداد 99

0
حذف شده

اگر برای ((، Yes چاپ میکنه دو حالت داره

حالت اول مفسر php هم خستس :-)حالت دوم اون خطی که داره ورودی میگیره   ممکنه چیز دیگه هم دریافت کنه که باعث چنین برداشتی میشه و گرنه برای (( حتما باید NoNo چاپ بشه 

https://wtools.io/php-sandbox/b۱w۸

برای [)  هم درسته مثل همون بالایی  باید NoNo چاپ بشه :-)

فایل پیوست

مهرداد

توسط

مهرداد

21 خرداد 99