Страница 1 из 1

Помогите с задачей баланс скобок в консольном приложение Visual studio

Добавлено: 01 мар 2013, 09:03
Алексей11
вот моя программа

Код: Выделить всё

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

namespace ConsoleApplication6
{
    class stack
    {
        public int maxStack;
        public string[] s;
        public int top = 0; // == number of elems. So [0] not used

        public stack(int maxSize)
        {
            maxStack = maxSize;
            s = new string[maxStack + 1];
        }

        public stack()
            : this(10)
        {
        }

        public bool push(string a)
        {
            if (top >= maxStack) return false;
            top++;
            s[top] = a;
            return true;
        }

        public bool empty()
        { return (top == 0); }

        public string pop()
        {
            if (top == 0)
                return "*EMPTY*";
            string res = s[top];
            top--;
            return res;
        }

    }
    class Program
    {
        static void Main(string[] args)
        {

            
            stack skobki = new stack();
            string str1;
            str1 = Console.ReadLine();
            //Console.ReadKey();
            //Console.WriteLine(str1);
            string[] arr = str1.Split(' ');
            int c = arr.Count();
            
            for (int i = 0; i < c; i++)
            {
                if (arr[i] == "(") { skobki.push(arr[i]); }
                if (arr[i] == ")")
                {
                    if (skobki.empty())
                    {
                         skobki.push(arr[i]); 
                    }
                    else skobki.pop();
                }
                if (arr[i] == "{") { skobki.push(arr[i]); }
                if (arr[i] == "}")
                {
                    if (skobki.empty())
                    {
                        skobki.push(arr[i]);
                    }
                    else skobki.pop();
                }
                if (arr[i] == "[") { skobki.push(arr[i]); }
                if (arr[i] == "]")
                {
                    if (skobki.empty())
                    {
                        skobki.push(arr[i]);
                    }
                    else skobki.pop();
                }
                {
                }


            }

            if (skobki.empty())
            {
                Console.WriteLine("Скобки сбалансированны");

            }
            else Console.WriteLine("Скобки не сбалансированны!");
            //Console.WriteLine(s1.pop());






            Console.ReadKey();
        }
    }
}
но она работает некорректно,если проверять ( ] то все равно пишет баланс скобок

Re: Помогите с задачей баланс скобок в консольном приложение Visual studio

Добавлено: 01 мар 2013, 18:09
Romeo
Во-первый вот это место не верно:

Код: Выделить всё

if (skobki.empty())
{
   skobki.push(arr[i]);
}
Если мы встретили ситуацию "( ) )" то на второй закрывающейся скобке можно сразу выдавать ошибку баланса независимо от того, что за ней идёт, так как нельзя закрывать ту скобку, которая ещё не открыта.

Второй момент это то, что ты для чего-то сделал стек скобок, но не используешь информацию, которая в нём хранится. Пользуешься только размером стека. С таким же успехом можно было бы сделать переменную, которая хранит текущий уровень вложенности скобок и использовать только её, без хранения всех открытых скобок.

Стек открытых скобок сделан, между прочим совсем не зря, именно с помощью него можно решить указанную проблему "( ]". Поправлять нужно вот этом место и два оставшихся идентичных:

Код: Выделить всё

                if (arr[i] == ")")
                {
                    if (skobki.empty())
                    {
                         skobki.push(arr[i]);
                    }
                    else skobki.pop();
                }
Вместо этого нужно написать что-то типа. Здесь уже учитывается и решение первой проблемы:

Код: Выделить всё

                if (arr[i] == ")")
                {
                    if (skobki.empty() || skobki.top() !=  "(")
                    {
                         Console.WriteLine("Скобки не сбалансированны!");
                         return;
                    }
                    skobki.pop();
                }
Где skobki.top() - новый метод, возвращающий, как не сложно догадаться, значение s[top].