Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2012, 14:13   #1
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию Программа, которая определяет правильность расстановок скобок (, [, {, ), }, ]

Идея в том, что если встретили открывающую скобку, то заносим в стек. Как только встретили закрывающую, то сравниваем ее с последней на стеке
Если все ок, то продолжаем, если плохо, то выходим
Вот код:

Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>
// #include <stdlib.h>
const int MAXSIZE = 100;
struct Stack 
{
	char data[MAXSIZE];
	int size;
};
void Push(Stack &S, char x)
{
	if (S.size == MAXSIZE)
	{
		printf ("Stack perepolnen\n");
		return;
	}
	S.data[S.size] = x;
	S.size ++;
}

char Pop (Stack &S)
{
	if (S.size == 0);
	{
		printf ("Stack pystoy\n");
		return char(255);
	}
	S.size--;
	return S.data[S.size];
}
int main()
{
	char br1[3] = { '(', '[', '{' };
	char br2[3] = { ')', ']', '}' };
	char stroka[80];
	Stack S;
	int OK;
	char temp;
	gets(stroka);
	S.size = 0 ;
	OK = 1;
	for (int i = 0; OK && (stroka[i]!='\0'); i++)
		for (int k=0; k<3; k++)
		{
			if (stroka[i] == br1[k])
			{
				Push (S, stroka[i]);
				break;
			}
			if (stroka[i]==br2[k])
			{
				temp = Pop ( S );
				if (temp  != br1[k])
					OK = 0;
				break;
			}
		}
		if (OK && (S.size == 0))
			printf ("good");
		else
			printf ("bad");
		getch();
		return 0;
}
Но когда я ввожу пример типа: asdasdasdasdasd) или <> печатает, что стек пустой и все плохо


Просьба помочь разобраться, в чем у меня ошибка?
sidestep вне форума Ответить с цитированием
Старый 04.04.2012, 14:31   #2
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Цитата:
asdasdasdasdasd) или <>
Стек же действительно пустой в обоих примерах.

Если найдена закрывающаяся скобка, а открывающихся ещё нет, значит можно выводить сообщение "bad" и прекращать работу.

Во втором случае - скобок вообще нет. Здесь не знаю как лучше интерпретировать. Как вариант введи флаг для этого случая.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 04.04.2012, 14:41   #3
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

Цитата:
Сообщение от sVasilich Посмотреть сообщение
Стек же действительно пустой в обоих примерах.
почему во втором примере он пустой?
Мы же увеличили стек, когда пришла скобка открывающая, а потом когда встретили закрывающую, уменьшаем, но строка закончена

Или я что-то не так понимаю?
sidestep вне форума Ответить с цитированием
Старый 04.04.2012, 14:47   #4
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

ну, ты проверяешь наличие скобок '(', '[', '{', а в примере - угловые. Если они тоже нужны, тогда сюда их добавь:

Код:
	char br1[3] = { '(', '[', '{' };
	char br2[3] = { ')', ']', '}' };
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 04.04.2012, 14:50   #5
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

описался в примере, если я ввожу [] - тоже самое выдает
sidestep вне форума Ответить с цитированием
Старый 04.04.2012, 14:55   #6
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

//не, ошибся)
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 04.04.2012, 14:57   #7
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

Все равно то же самое
sidestep вне форума Ответить с цитированием
Старый 04.04.2012, 14:58   #8
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

Цитата:
А то у тебя стек с нуля начинается, а когда нулевой элемент считываем, стек уже считается пустым.
Так мы в стек заносим только скобки, на нулевой элемент он не должен обращать внимание
sidestep вне форума Ответить с цитированием
Старый 04.04.2012, 15:08   #9
LiuLiuJons
Форумчанин
 
Регистрация: 28.12.2011
Сообщений: 124
По умолчанию

Я не знаю в чём прикол, но когда я работаю с этим кодом (он полностью аналогичен твоему!!! я не вижу разницы!):
Код:
const int MAXSIZE = 100;
struct Stack 
{
	char data[MAXSIZE];
	int size;
};
void Push(Stack &S, char x)
{
	if (S.size == MAXSIZE)
	{
		printf ("Stack perepolnen\n");
		return;
	}
	S.data[S.size] = x;
	S.size++;
}

char Pop (Stack &S)
{
	if (S.size == 0)
	{
		printf ("Stack pystoy\n");
		return char(255);
	}
	S.size--;
	return S.data[S.size];
}
У меня всё работает. (В смысле при вводе [] говорит, что всё хорошо)

А когда копирую тот, что у тебя в первом посту и заменяю этот на него - получаю - стек пустой и всё плохо. Магия??
"Думай не о задаче, а о решении" (с)
LiuLiuJons вне форума Ответить с цитированием
Старый 04.04.2012, 15:15   #10
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию

Представь у меня тоже теперь так)
sidestep вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на Паскаль, которая определяет, попадает ли точка с заданными координатами в закрашенную область Chulpan Паскаль, Turbo Pascal, PascalABC.NET 2 28.03.2012 12:59
С++ прогамма которая определяет высокосный или нет год vireles Помощь студентам 3 15.03.2012 21:00
программа, которая с точностью определяет значения функции y=ln(1-x),а модуль х<1, АлександрFRONT Паскаль, Turbo Pascal, PascalABC.NET 2 10.12.2008 01:37
разработать функцию, которая определяет сумму цифр целого числа IceAgainstIce Общие вопросы Delphi 5 20.11.2008 00:52
Паскаль.программа, которая определяет каким является введенное число... Integer Помощь студентам 4 18.11.2007 22:17