IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası

IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası (https://www.ircforumlari.net/)
-   C ve C++ (https://www.ircforumlari.net/c-ve-c/)
-   -   Yığınlarla parantez kapama (https://www.ircforumlari.net/c-ve-c/456491-yiginlarla-parantez-kapama.html)

aSi 25 Şubat 2012 19:50

Yığınlarla parantez kapama
 
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

Kod:

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <cstdlib>

using namespace std;
class node;

class node
{
private :
    int satir;
    char parantez;
public  :
    class node *sonraki;
    bool sorun;
    char getParantez()
    {
        return parantez;
    }
    int getSatir()//satir getirir
    {
        return satir;
    }
    int charCompare(char ch)// o sinifin elemani ile ch karsilastirilir uyusuyorsa 1 gonderir
    {
        if(parantez == ch)return 1;
        return 0;
    }
    node(char ch,int atananSatir) //yapicimiz ilk degerleri veriyor.
    {
        parantez = ch;
        satir = atananSatir;
        sorun = false;
        sonraki = NULL;
    }
} *bas,*son;
void pushStack(char ch,int satir)// push stack adi ustunde yigina atma gorevini ustlenen fonksiyon
{
    class node *yeni;
    if(bas == NULL) // ilk elemanda ise yeni eleman yaratilir
    {
        bas = new node(ch,satir);
        son = bas;
    }
    else
    {              //ilk eleman degil o yuzden basa eklenir
        yeni = new node(ch,satir);
        yeni->sonraki = bas;
        bas = yeni;
    }

}
class node * pullStack(char ch,int satir) //pullstack yigindan veri ceker.
{
    char chCopy;
    switch(ch)//hangi elemanin cekilecegine karar verilir
    {
        case ']' :
            chCopy = '[';
            break;
        case '}' :
            chCopy = '{';
            break;
        case ')' :
            chCopy = '(';
        default :
            chCopy = ch;
            break;
    }
    class node *silinecek;
    if(bas == NULL)
    {
        cout<<"\n\t\t Uyari!\n"<<" Acilan parantez kapatilmamis!";
    }
    else if(! bas->charCompare(chCopy))//uyusmuyorsa girecek
    {
        cout<<"\n\t\t Uyari!\n "<<bas->getSatir()<<".Satirda "<<bas->getParantez()
        <<" ile acilan parantez "<<ch<<" ile "<<satir<<" satirda kapanmis!"<<endl;
        cin.get();
        exit(1);
    }
    else if(bas->charCompare(chCopy))//uyusuyorsa silme islemi yapiliyor
    {
        silinecek = bas;
        bas = bas->sonraki;
        delete silinecek;

    }
}

int main()
{
    int satir=1;
    bool ciftTirnakKontrol = false,tekTirnakKontrol = false;// cift ve tek tirnak icin kontrol yapilari
    char temp;
    FILE *dosya;

    dosya=fopen("kaynak.c","r"); //kaynak dosyamizi okuma modunda aciyoruz

    if(!dosya)// dosyamiz acilmazsa cikis
    {
        printf("\n\t\t\t\t Uyari!!!\n\n\t\t\t    Dosya Okunamadi!");
        getch();
        exit(1);
    }

    while(!feof(dosya))// dosya sonuna kadar okuma islemi yaparak ekleme ve cikarma islemi yapacaz
    {
        temp = getc(dosya); // dosyadan bir deger okuyup tempe attik

        if(temp == '\n') // satir sonuysa bir satir artiriyoruz
        {
            satir++;
        }
        ///ACILAN PARANTEZLERLE YIGINA EKLEME YAPILIR
        else if(temp == '{' || temp == '[' || temp == '(' || temp == 39 || temp == '"') // 39 ascii tablosunda ' esit
        {
        /*                                                                                              *\
            Tirnak kontrollerini acilis ve kapanisi ayni karakter oldugundan farkli degerlendirmek
            zorunda kaldim.Burdaki tirnak kontrol algoritmasi ilk tirnak okundugunda kontrol false dan
            true ya ceviriliyor boylece bir daha tirnak okundugunda bunun kapama tirnagi oldugu biliniyor
            tabi programin simdiki eksigi tirnagi bir isaret olarak yazdirmak icin sizde biliyorsunuz ki
            sola yatik sekilde yazabiliriz ornegin \" seklinde yazdigimda da tirnak kontrolunde olmamasi
            gerektigi halde degisim olacak gelistirmek isteyen olursa onu fixler :)               
        \*                                                                                              */
            if(temp == 39)
            {
                if(tekTirnakKontrol)
                {
                    pullStack(temp,satir);
                    tekTirnakKontrol = false;
                }
                else
                {
                    tekTirnakKontrol = true;
                    pushStack(temp,satir);
                }
            }
            if(temp == '"')
            {
                if(ciftTirnakKontrol)
                {
                    pullStack(temp,satir);
                    ciftTirnakKontrol = false;
                }
                else
                {
                    ciftTirnakKontrol = true;
                    pushStack(temp,satir);
                }
            }
            if(temp != 39 && temp != '"' )
            {
                if(tekTirnakKontrol || ciftTirnakKontrol)
                {
                    cout<<"\n\t\t Uyari!\n "<<bas->getSatir()<<" da "<<bas->getParantez()<< " kapanmamis."<<endl;
                    cin.get();
                    exit(1);
                }
                pushStack(temp,satir);
            }
        }
        ///KAPANAN PARANTEZLERLE YIGINDAN ATMA YAPILIR
        else if(temp == '}' || temp == ']' || temp == ')')// burada kapama parantezi okunursa yigindan alma islemi yapiyoruz.
        {

            pullStack(temp,satir);
        }
    }
return 0;
}




Tüm Zamanlar GMT +3 Olarak Ayarlanmış. Şuanki Zaman: 04:38.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2025, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
Copyright ©2004 - 2025 IRCForumlari.Net Sparhawk