2
Nis'11

İşlem Parantezleri Sağlaması Yapan C Kodu (C Programlama Dili)

Program stack mantığı ile yazılmıştır.Her zaman doğru sonucu bulduğunu umuyorum.Birçok deneme yaptım.

Çeşitli işlemlere ait parantezleri doğru veya yanlış olarak girerek programı deneyebilirsiniz.Parantez haricinde, işlemdeki diğer sayılar veya semboller hakkında bir kontrol yapmaz ve işlem sonucu döndürmez.

Herhangi bir açık bulursanız yorum bırakmanızı rica ederim.

//BAGLI LISTE STACK

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

struct Liste{
       char chr;
       Liste *sonraki;
};
Liste *ilk, *son, *onceki, *siradaki, *gecici;

main(){
       char islem[30],*pi;
       int bitti=1,uzunluk;
       printf("islem Giriniz : "); scanf("%s",&islem);
       pi=islem;
       uzunluk = strlen(islem);

       while(uzunluk){
            if(*pi=='{' || *pi=='(' || *pi=='['){//parantez açmaları stack'a yerlestirmek lazım.
                        gecici=(Liste *) malloc(sizeof(struct Liste));
                        if(ilk == NULL){//stack boş ise
                            ilk=gecici;
                            ilk->chr = *pi;
                            ilk->sonraki = NULL;
                            son=ilk;          
                        }
                        else{//stack boş degilse
                            if(son == ilk){//sadece 1 kayıt varsa
                                   son = gecici;
                                   son->chr = *pi;
                                   ilk->sonraki = son;
                                   son->sonraki = NULL;      
                            }
                            else{//bir veya daha fazla kayıt varsa
                                   siradaki = son;//siradaki sadece temp gorevi goruyor burada
                                   son = gecici;
                                   siradaki->sonraki = son;
                                   siradaki = onceki; //son kayıt eklendiginde önceki kayıt bilgisede tutuluyor.
                                   son->chr = *pi;
                                   son->sonraki = NULL;    
                            }               
                        }                          
            }
            else if((*pi=='}' || *pi==')' || *pi==']') && (ilk != NULL)){//kapama parantezlerinden herhangi biri ise stack'in son elemanıyla karşılaştırmalıyız.
                   if( ( *pi=='}' && son->chr=='{' ) || ( *pi==')' && son->chr=='(' ) || ( *pi==']' && son->chr=='[' ) ){//parantez'ler doğru eşleşiyorsa.
                        onceki = ilk;//sonun bi oncesini yakala.
                        if(ilk == son){//tek kayıt varsa
                                   ilk = NULL; 
                                   free(ilk);
                                   bitti=1;//stack boşalıyorsa kayıtlar hep dogru eşleşmiş demektir.
                                   //break koymuyoruz çünkü stackın boşalması kontrolün bitmesi anlamına gelmez.
                        }
                        else{//1 den fazla kayıt varsa
                            while(onceki->sonraki != son){//sondan bir öncekini bul
                                 onceki = onceki->sonraki;        
                            }
                            if(onceki == ilk){//eger o önceki ilk kayıtsa zaten 2 kayıt var demektir.
                                 free(son);//o ikinci kayıtta zaten son kayıttır.
                                 son = ilk;// bu satırı yazmalıyız çünkü ilk = son ise tek kayıt oldugunu anlarız.
                            }
                            else {//2 kayıttan daha fazla kayıt varsa
                                 free(son);
                                 son = onceki;
                                 son->sonraki = NULL;
                            }
                        }     
                   }
                   else {//parantezler doğru eşleşmiyorsa
                        bitti = 0;
                        break;     
                   }   
            }
            else if((*pi=='}' || *pi==')' || *pi==']') && (ilk == NULL)){//yazılan ilk parantez, kapama parantezlerinden biri ise zaten yanlıştır.
                         bitti = 0;
                         break;             
            }
            pi++;//bir sonraki eleman kontrol edilecek.  
            uzunluk--;          
       }
       //end While

       if(bitti && ilk == NULL) printf("\nYazim Hatasi Yok TEBRIKLER!");//bitti en başta 1 olarak tanımlanmıştı.Hala öyle kaldıysa ve stack boşsa demekki hata yok.
       else printf("\nHATALI ISLEM!");//aksi takdirde bir hata mesajı ekrana yansıtmak lazım.

getch();
}

Yeni makaleleri E-Mail ile takip edin!