Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
нэ
64 / 64 / 42
Регистрация: 08.04.2010
Сообщений: 166
1

Правильное скобочное выражение

05.03.2011, 23:49. Показов 2415. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дана последовательность из N круглых, квадратных и фигурных скобок. Выяснить, можно ли добавить в неё цифры и знаки арифметических действий так, чтобы получилось правильное арифметическое выражение.
Ограничения: 1 <= N <= 100 000.
Ввод: В первой строке находится число скобок N, во второй - N символов из набора (, ), [, ], {, }.
Вывод: Выводится слово "Yes", если получить правильное арифметическое выражение можно, или "No", если нельзя.

Примеры

Ввод 1
6
([())]
Вывод 1
No

Ввод 2
24
{[()([]{})[]]({}{{}})}[]
Вывод 2
Yes


мое решение:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.util.*;
import java.io.*;
 
public class Main {
    PrintWriter out;
    Scanner in;
 
    void solve() {
        Stack<Character> s = new Stack<Character>();
        int n = in.nextInt();
        String str = in.next();
        for (int i = 0; i < str.length(); i++) {
            switch (str.charAt(i)) {
            case '(': {
                s.push('(');
            }
            case '[': {
                s.push('[');
            }
            case '{': {
                s.push('{');
            }
            case ')': {
                if (s.peek() != '(') {
                    out.print("No");
                    return;
                } else {
                    s.pop();
                }
            }
            case ']': {
                if (s.peek() != '[') {
                    out.print("No");
                    return;
                } else {
                    s.pop();
                }
            }
            case '}': {
                if (s.peek() != '{') {
                    out.print("No");
                    return;
                } else {
                    s.pop();
                }
            }
            }
        }
        if (s.empty()) {
            out.print("Yes");
        } else {
            out.print("No");
        }
    }
 
    void run() {
        in = new Scanner(System.in);
        out = new PrintWriter(System.out);
        try {
            solve();
        } finally {
            out.close();
        }
    }
 
    public static void main(String[] args) {
        new Main().run();
    }
}
но почему-то всегда выдает No. Помогите пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2011, 23:49
Ответы с готовыми решениями:

Содержит ли строка правильное скобочное выражение
Дана строка символов. Определить является ли она правильным скобочным выражением. Рассматриваются...

Добавить числа в скобочное выражение, чтобы получилось правильное арифметическое выражение
1.Дана последовательность из N круглых, квадратных и фигурных скобок. Выяснить, можно ли добавить в...

Правильное скобочное выражение
Не могу придумать как записать условие в 22 строке. Нужно чтобы если в вершине стека что то из ( {...

Строка: Определить, сколькими способами можно получить правильное скобочное выражение из заданной строки...
Условие Задан шаблон, состоящий из круглых скобок и знаков вопроса. Требуется определить,...

4
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
06.03.2011, 12:33 2
Скорее всего проблема в том, что ты слепо полагаешься на автобоксинг и не понимаешь разницы между Character и char.
1
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
06.03.2011, 21:31 3
aleksandy, глупость какая.

Домолаз, учитесь дебагом пользоваться.

Почему не работает
Потому что в case надо ставить break.
А еще на тест
1
)
s.peek() выбросит эксепшн.
1
нэ
64 / 64 / 42
Регистрация: 08.04.2010
Сообщений: 166
06.03.2011, 23:17  [ТС] 4
доработал:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import java.util.*;
import java.io.*;
 
public class Main {
    PrintWriter out;
    Scanner in;
 
    void solve() {
        Stack<Character> s = new Stack<Character>();
        in.nextInt();
        String str = in.next();
        for (int i = 0; i < str.length(); i++) {
            switch (str.charAt(i)) {
            case '(':
                s.push('(');
                break;
            case '[':
                s.push('[');
                break;
            case '{':
                s.push('{');
                break;
            case ')':
                if (!s.empty() && !s.pop().equals('(')) {
                    out.print("No");
                    return;
                }
                break;
            case ']':
                if (!s.empty() && !s.pop().equals('[')) {
                    out.print("No");
                    return;
                }
                break;
            case '}':
                if (!s.empty() && !s.pop().equals('(')) {
                    out.print("No");
                    return;
                }
                break;
            }
        }
        if (s.empty()) {
            out.print("Yes");
        } else {
            out.print("No");
        }
    }
 
    void run() {
        in = new Scanner(System.in);
        out = new PrintWriter(System.out);
        try {
            solve();
        } finally {
            out.close();
        }
    }
 
    public static void main(String[] args) {
        new Main().run();
    }
}
все тесты прошло.Спасибо за помощь!
0
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
09.03.2011, 10:59 5
Цитата Сообщение от Хохол Посмотреть сообщение
aleksandy, глупость какая.
И где глупость?
Java
1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) throws Exception {
    char[] chars = new char[] {'[', ']', '{', '}', '(', ')'};
    System.out.println("array: " + Arrays.toString(chars));
    Stack<Character> stack = new Stack<Character>();
    for (char ch : chars) {
        stack.push(ch);
    }
    System.out.println("stack: " + stack);
    for (char ch : chars) {
        System.out.println(ch != stack.pop());
    }
}
0
09.03.2011, 10:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2011, 10:59
Помогаю со студенческими работами здесь

Скобочное выражение
Помогите реализовать програмку: Дано скобочное выражение, оканчивающееся точкой с запятой. Само...

Проверить является ли скобочное выражение правильным
Является ли выражения вида ()()()()()())))()( правильным, на вход подается символы '(' и ')' в...

Дано скобочное выражение, оканчивающееся точкой с запятой
Дано скобочное выражение, оканчивающееся точкой с запятой. Определить: количество уровней...

Дано скобочное выражение, оканчивающееся точкой с запятой
Дано скобочное выражение, оканчивающееся точкой с запятой. Определить: количество уровней...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru