25 Şubat 2012, 19:50
|
#1 |
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
| Yığınlarla parantez kapama
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. Kod: Kodu kopyalamak için üzerine çift tıklayın! #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;
}
__________________ Doğruları biliyorsan, yalanları dinlemek eğlencelidir. |
| |