[Çözüldü] C++ ile stack'lerde parantez kontrolü

Başlatan garbagecollector, 30 Ekim 2016 - 00:08:17

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

garbagecollector


#include<iostream>
#include<stack>
#include<string>
#include<conio.h>
using namespace std;
/*string bir ifadede açılan ve kapanan parantez sayılarına göre parantez hatası olup olmadığını
stack veri yapısı kullanarak bulan fonksiyon*/
int hata_var(string ifade){
int sayi;
     stack<char> S;
for(int i = 0;i< ifade.length();i++) {
if(ifade[i] == '(' || ifade[i] == '[') {
   sayi++;
   S.top();
   S.push(ifade[i]);
   }                 //S.push(ifade[i]) S.pop();
        else if(ifade[i] == ']' || ifade[i] == ')'){
         sayi--;
         S.pop();
if(sayi<0) return sayi+2;
}}
        return sayi;
     //if(!S.empty()) return true; else return false;
     //true sonucu dönerse hata var, false sonucu dönerse hata yok demektir...
          }
int main(){
string ifade="";
cout<<"\n ifadenizi giriniz:";
cin>>ifade;
if(hata_var(ifade)==0) 
              cout<<"ifadede parantez hatasi yok..."; 
                     else if(hata_var(ifade)>0) cout<<"ifadede parantezi kapatmamis...";
                    else cout<<"ifadede parantezi acmamissin...";
       cout<<"\n devam icin bir tusa basiniz..."; getch();}


merhabalar

yukarda yazdığım kod şu ifadede --> ")A+B(-C" bana istediğim sonuç olan "parantezi açmamışsın" 'ı veriyor ancak şöyle bir ifadede --> "(A+B))-(C+D" "parantezi açmamışsın" yerine   "ifadede parantezi kapatmamis..." veriyor.
Çözümü görebilen var mı ?

bugra9

Merhaba,

Soruna değinmeden önce iki şey belirtmek istiyorum.
1) Kodların çok karışık. Düzenli yazılan bir kod, okumayı kolaylaştıracağı için cevap alma olasılığını da arttırır.
2) Burası bir linux forumu ama kodlarınız içinde windows kütüphanesi kullanmışsınız. Buradaki çoğu kişide kodlar çalışmayacağı için yine yardım alma olasılığınızı düşürüyorsunuz.

Sorununuza gelecek olursak, önce kodunuzu inceleyelim.
1) Öncelikle belirttiğiniz gibi ")A+B(-C" yazınca "parantezi açmamışsın" sonucunu döndürmüyor. Yani çoğu yerde yanlış sonucu veriyor.
2) Yığın (Stack) yapısını kullanmış olmak için kullanmışsınız yani niye kullandığınız belli değil. Yığın ile ilgili tüm kodları silerseniz kodlar aynı girişte yine aynı sonucu döndürecektir. Madem koda etkisi yok niye kullandınız.

Şimdi de hatalara değinelim.
1) Genel olarak hatalı olmasının sebebi if(sayi<0) return sayi+2; satırı görünüyor. Niye 2 ile topladınız bilmiyorum ama mantıken "sayi" değişkeni negatif olduğunda döndüreceğiniz değer de negatif olmalı. Bu değişken -1 olduğunda 2 ile toplayıp döndürdüğünüz için sonuç pozitif oluyor ve yanlış sonuca varıyor.
2) Anladığım kadarıyla sizin istediğiniz yığın yapısını kullanmak. Öncelikle yığın yapısının ne amaçla kullanıldığını bilmelisiniz. Burada yığın kullanmak istiyorsanız yığını parantezlerin sırasının kontrolünde kullanabilirsiniz. Örneğin sizin kodda "(a[b)]" girişi "parantezde hata yok" sonucunu döndürecektir. Eğer son açılanın ilk kapatılması gerektiği kuralını uygulamak isterseniz yığın tam bu iş içindir. Yani [ parantezinin ) ile kapatılmasını kabul etmez. Fikir vermesi açısından kodlarınızı bu şekilde düzenleyip ekliyorum.


#include <iostream>
#include <stack>
#include <string>

using namespace std;

char hata_var(string ifade)
{
stack<char> S;
for (int i = 0; i < ifade.length(); i++)
{
switch(ifade[i]) {
case '(':
case '[':
// Eğer karakterimiz ( veya [ karakteri ise bu karakteri kaydediyoruz.
S.push(ifade[i]);
break;
case ')':
/* Kayıt boş ise parantezin açılmadığını anlıyoruz.
Ayrıca son kayıt ( değilse yanlış karakter kapatılmış oluyor.
Eğer her şey doğru ise ( parentezi kapatıldığı için listeden çıkarıyoruz. */
if(S.size() == 0 || S.top() != '(')
return ')';
else
S.pop();
break;
case ']':
/* Kayıt boş ise parantezin açılmadığını anlıyoruz.
Ayrıca son kayıt [ değilse yanlış karakter kapatılmış oluyor.
Eğer her şey doğru ise [ parentezi kapatıldığı için listeden çıkarıyoruz. */
if(S.size() == 0 || S.top() != '[')
return ']';
else
S.pop();
break;
}
}
/* Normal şartlarda parantez kapatılınca listeden çıkarıyorduk.
Tüm parantezler kapatıldığında liste boş olmalı.
Eğer liste boş değilse en tepedeki elemanın kapatılmadığını anlıyoruz */
if(S.size() > 0)
return S.top();
else
return '-';

}

int main()
{
string ifade = "";
cout << "İfadenizi giriniz: ";
cin >> ifade;

switch( hata_var(ifade) ) {
case '-':
cout << "İfade içerisinde parantez hatası yok." << endl;
break;
case '(':
cout << "İfade içerisinde () parantezi kapatılmamış." << endl;
break;
case '[':
cout << "İfade içerisinde [] parantezi kapatılmamış." << endl;
break;
case ')':
cout << "İfade içerisinde () parantezi açılmamış." << endl;
break;
case ']':
cout << "İfade içerisinde [] parantezi açılmamış." << endl;
break;
}
return 0;
}

garbagecollector

ilgilendiğiniz için teşekkür ederim. Sayenizde birkaç şey öğrenmiş oldum.

bugra9

Rica ederim. Konu sizin için çözüldüyse şöyle bir uygulamamız bulunuyor.
cozuldukonusu

bülenty

Merhaba
yazmıs oldugunuz kodu inceledim buna benzer sekılde bir ödevim var ek olarak istenilen hata olan yere kadar ifadenin yazılması
yardımcı olursanız sevinirim