[C#] Домашно Strings and Text Processing - 3 задача


6

Условие: Write a program to check if in a given expression the brackets are put correctly.

Example of correct expression: ((a+b)/5-d).
Example of incorrect expression: )(a+b)).

Решениеsource.

Обяснение: Четем стринга символ по символ. Имаме променлива, която ни следи колко скоби сме отворили досега. Ако на дадена стъпка сме затворили скоба, която не е отваряна, резултатът е грешен. Ако сме стигнали до края и променливата е 0, следователно всички са затворени.

Аналогично ако имате и няколко вида скоби (начупени, къдрави) или тагове в израза.

Edit: Проверете решенията си за израза ")a + b("!




Отговори



6

Решение:

http://pastebin.com/2zkPQSXa.

Обяснение:

1. Преобразувам string-a в char масив

2. Създавам си 1 променлива, ако скобата е отваряща добавам 1 , аналогично ако е затваряща -1. Тънкият момент е, че ако имаме израз започващ с затваряща скоба веднага го приемаме за невалидно и break;, също така ако брояча накрая НЕ е равен на НУЛА пак е невалидно

3. Накрая проверявам дали броят на отворените скоби е равен на броя на затворените скоби, един вид ако брояча накрая НЕ е равен на НУЛА пак е невалидно.

Идеята ми хрумна от една лекция на Наков по HTML , в която той казваше: "Ако искате да проверите дали има липсващ таг, бройте колко тага сте отворили и колко сте затворили. Ако са равни значи е ОК, ако ли пък не имате проблем."

ЕДИТ: Оправено е, а цитатът на Наков не е много валиден вече, но ще го оставя :)


от Assi.NET (3050 точки)


0
Здравей, само една забележка, че губиш наредбата. Примерно за ")(2+3)/2(", трябва да даде грешен резултат. Оправих условието, благодаря.

от jasssonpet (6814 точки)

0
моето решение е същото, но добавих и проверка ако затварящата скоба е непосредствено след или отварящата непосредствено преди някакъв знак. jasssonpet, има 2 проверки за отрицателни стойности, едната от тях е вътре в цикъла - тя прекъсва цикъла веднака щом се появи отрицатената стойност (при първи случай когато затварящите скоби са повече от отварящи)

от mvgmvg (296 точки)



0
Ако става въпрос само да проверим скобите (както е в задачата) логиката е лесна: При всяко отваряне на скоба - counter++, при всяко затваряне на скоба- counter--, а ако по всяко едно време брояча стани отрицателен значи имаме грешка

от triplexsa (60 точки)