Odwracanie stosu typu char - różnie działa dla różnych zestawów danych.

0

Napisać metodę bool CheckBrackets(string expression), która sprawdzi czy podane wyrażenie z nawiasami okrągłymi i kwadratowymi jest poprawne. Do rozwiązania wykorzystać stos.
Przykłady poprawnych wyrażeń: ([(([]))]), () , [] , ()()()[()]
Przykłady niepoprawnych wyrażeń: ([(([])]), (], (, ([(([][))

Napisałem coś takiego i dla poprawne zwraca false

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ZLabStos
{
    class Program
    {
        

        public static bool CheckBrackets(string expression)
        {

            bool good = false;
            Stack<char> stack = new Stack<char>();
            for (int i = 0; i < expression.Length; i++ )
            {
                stack.Push(expression[i]); //umieszczamy elementy w stosie
            }

            Console.Write("Stos: ");
            foreach(char el in stack){
                Console.Write(el + " ");
            }
            var stackCopy = new Stack<char>(stack.ToArray());
            Console.WriteLine();
            Console.Write("\nKopia stosu: ");
            foreach(char el in stackCopy)
            {
                Console.Write(el + " ");
            }

            
            for (int i = 0; i < stack.Count; i++)
            {
                if (stack.Pop().Equals(stackCopy.Pop()))
                {
                    good = true;
                }
                else
                {
                    good = false;
                }
            }
            return good;
        }
        static void Main(string[] args)
        {

            //Przykłady poprawnych wyrażeń: ([(([]))]), () , [] , ()()()[()] 
            //Przykłady niepoprawnych wyrażeń: ([(([])]), (], (, ([(([][))

            //Poprawne zwraca true
            String p1 = "([(([]))])";
            String p2 = "()";
            String p3 = "[]";
            String p4 = "()()()[()]";
            //Niepoprawne zwraca false
            String n1 = "([(([])])";
            String n2 = "(]";
            String n3 = "(";
            String n4 = "([(([][))";

            String expression = "";
            
            //Console.WriteLine("Podaj wyrażenie: ");
            //expression = Console.ReadLine();
            expression = p1;
            Console.WriteLine("\n" + CheckBrackets(expression));
            Console.ReadKey();
        }
    }
}

Dla testu wpisuję sobie cyfry np. 123 i za każdym razem jest: true, a gdy wpiszę np 1234 to za każdym razem jest false. Widać na screenach w załączniku. Nie rozumiem dlaczego raz działa, a raz nie.

0

Equals w Twoim przypadku będzie działać inaczej niż oczekujesz. Ja stworzyłbym zmienne a oraz b, które odpowiednio zmniejszałbym i zwiększał przy otwieraniu i zamykaniu nawiasu. Jeśli na końcu obie zmienne będą równe 0 to znaczy, że tyle samo jest nawiasów otwierających to zamykających. Inna walidacja w zadaniu nie jest wymagana.
Do zwiększania i zmniejszania zmiennych możesz użyć instrukcji switch - case.

0

Tak najbanaljniej...

for (int i = 0; i < stack.Count; i++)
            {
               var e = (int)stack.Pop();
               var f = (int)stackCopy.Pop();
                
                if ((f==91&&e==93) || (f==40&&e==41))
                {
                    good = true;
                }
                else
                {
                    good = false;
                }
            }

            return good;

Ale dziala w przypadku Twoich nawiasow.
Pozdrawiam

Acha, i zmien logike wyjscia z metody, bo dla tego "(]()()" tez otrzymasz TRUE. W zasadzie dla wszystkich parzystych kombinacji gdzie ostatnia sprawdzana para daje true.
No i nie sprawdzasz czy liczba nawiasow sie zgadza...;)

0

A nie można po prostu wkładać na stos, gdy natrafi się nawias otwierający, a zdejmować, gdy trafi się na nawias zamykający? Nie trzeba wtedy nawet niczego liczyć, bo jeśli na stosie zostaje 0 elementów, to wszystko jest w porządku, a jeśli chcemy zdjąć z pustego stosu, to znaczy, że za dużo jest nawiasów zamykających. Tyle tylko, że potrzeba dwóch stosów, dla obu rodzajów nawiasów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1