2016-04-07 17 views
1

bir aritmetik dize parantez symmerty denetleniyor:Böyle bir dize verilen kontrol etmek istiyorum en iyi şekilde

(a[i]+{-1}*(8-9)) 

Geçerli vasıta geçerlidir: Tamam

([]{}()) 

, ve Geçerli değil:

{([[})) 

Bunu yığınlar aracılığıyla yapmaya çalışıyorum.
İlk olarak, bu 3 parantezin herhangi bir dirseğini ayıklayın ve geriye doğru itin. İkinci yığın bir kez daha varsa o kadar itin:

( [ ] { } ( ) ) 

İlk yığın alır:

) ] } ) 

ve İkinci yığını alır:

) } ] ) 

Şimdi mantık kısmını gelir.

Gerçekten çok çirkin bir çözüm buldum. İdeal nedir?

public static string aritmethic { get; } = "(a[i]+{-1}*(8-9))"; 
    Stack<char> original = new Stack<char>(); 
    Stack<char> temp = new Stack<char>(); 
: İşte benim arithmetric dize ve 2 binmektedir, neyse

(ve çalışma olduğundan benim çözüm sonrası yapmayın lütfen, henüz sadece dağınık ve bok ve uzak "ideal" bir)

public void PushToOriginal() 
    { 
     for (int i = 0; i < aritmethic.Length; i++) 
     { 
      if ((aritmethic[i] == '{')) 
      { 
       original.Push('}'); 
      } 
      else if (aritmethic[i] == '[') 
      { 
       original.Push(']'); 
      } 
      else if (aritmethic[i] == '(') 
      { 
       original.Push(')'); 
      } 
     } 
    } 

ikinci yığın itme:

public void PushToTemp() 
    { 
     for (int i = 0; i < original.Count; i++) 
     { 
      temp.Push(original.Pop()); 
     } 
    } 
Burada

ilk yığın ters itmeVe şimdi bunun arkasında iyi bir mantığa ihtiyacım var:

public void Checker() 
    { 
     //Logic here 
     /* 
     if (temp.Peek() == ....) 
     temp.Pop(); 
     *May cause an error 
     */ 
      if (temp.Count == 0) 
       Console.WriteLine("Aritmethic Matches!"); 
      else 
       Console.WriteLine("Aritmethic does not Match!!"); 
     } 
    } 

Umarım sorum hakkında yeterince açıkım. Teşekkürler! BTW, Gerçekten çok CSharp için taze, bu yüzden bana hiçbir sert!

+0

Sormaya çalıştığınız soruyu anlamadım mı? Çirkin bir çözümün var, ama çalışıyor mu? Daha iyi bir çözüm mü arıyorsun? –

+0

Gerçekten. Çözümüm doğrudan Yığınların gücü ile uğraşıyordu. Daha çok baypas etmek ve etrafta dolaşmak gibi. Çözümünüzde – N3wbie

cevap

3

Sen yapabileceğiniz tüm bu oldukça basit tek yığını ve giriş dizesi tek bir geçiş kullanılarak: Eğer bir açılış ayracı karşılaştığında bekliyoruz sonraki şey eşleşen bir kapanış çünkü

var openers = "([{"; 
var closers = ")]}"; 
var brackets = new Stack<char>(); 
for (int i = 0; i != s.Length; ++i) { 
    if (openers.Contains(s[i])) 
     brackets.Push(s[i]); 
    else if (closers.Contains(s[i])) { 
     var opener = openers[closers.IndexOf(s[i])]; 
     if (brackets.Count == 0 || brackets.Peek() != opener) 
      Console.WriteLine("Mismatched '{0}' at {1}", s[i], i); 
     else 
      brackets.Pop(); 
    } 
} 
if (brackets.Count != 0) 
    Console.WriteLine("Unmatched '{0}'", brackets.Peek()); 

Bu işleri braket (veya yuvalanmış bir kapsam oluşturan başka bir açılış aparatı). Böylece kod, her açılış bloğu için yığının üzerine yeni bir durumu iter ve bir kapatma braketi ile karşılaştığında, o durumu (eşleştiklerini kontrol ederek) çıkarır.

0
static void Main(String[] args) 
{ 
    string input = "{()}"; 
    bool success = true; 
    HashSet<char> openBrackets = new HashSet<char>() { '(', '{', '[' }; 
    HashSet<char> closeBrackets = new HashSet<char>() { ')', '}', ']' }; 
    Stack<char> mystack = new Stack<char>(); 
    for (int i = 0; i < input.Length; i++) 
    { 
     if (openBrackets.Contains(input[i])) 
      mystack.Push(input[i]); 
     else if (closeBrackets.Contains(input[i])){ 
      if(mystack.Count == 0) 
      { 
       success = false; 
       break; 
      } 
      if (input[i] == '}' && mystack.Peek() == '{') 
        mystack.Pop(); 
      else if (input[i] == ')' && mystack.Peek() == '(') 
        mystack.Pop(); 
      else if (input[i] == ']' && mystack.Peek() == '[') 
        mystack.Pop(); 
      else 
      { 
       success = false; 
       break; 
      } 
     } 


    } 

    if (mystack.Count == 0 && success) 
     Console.WriteLine("Correct Input"); 
    else Console.WriteLine("Incorrect input"); 

    Console.ReadKey(); 
} 

Algoritma: 1. Yeni bir yığın oluşturmak !! 2. Bir açılış dirseği ile karşılaştığınızda, yığını üzerine itin. 3.Bir kapatma dirseği ile karşılaştığınızda, yığının üstündeki geçerli öğenin, kapanış desteğinin karşılık gelen bir dirseği olduğunu kontrol edin. Eğer öyleyse, yığının en üst öğesini seçin. 4. Son olarak, yığındaki kalan öğelerin sıfır olup olmadığını kontrol edin!

+0

yığınının boş olmasını çok isterim "(a [i] + {- 1} * (8-9)))" yanlış olması gerekir. – N3wbie

+0

koşullarının birçoğu doğru. Çözümümü güncelliyorum –

İlgili konular