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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2013, 22:30   #1
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию Стеки на Си

Здраствуйте.
В строке записан текст что сбалансированный за круглыми скобками:
<текст>::=<пусто>|<елемент><текст >
<елемент>::=<буква>|(<текст>)
Надо для каждой пары скобок открывающиеся и закрывающиеся напечатать номера их позиций в тексте, упорядочив пары номеров по возрастанию номеров позиций скобок видкриваються.Наприклад, для текста А + (45-F (X)*(B-C)) нужно напечатать 3 17;8 10;12 16.
majuw вне форума Ответить с цитированием
Старый 17.05.2013, 16:34   #2
majuw
Пользователь
 
Регистрация: 04.04.2013
Сообщений: 77
По умолчанию

Что никто не может помочь?
majuw вне форума Ответить с цитированием
Старый 17.05.2013, 16:53   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

На уровне концепции: завести список пар позиций, как глобальный объект. Функция подсчёта скобок принимает указатель на позицию в строке, идёт по строке, пока не найдёт закрывающую, открывающую скобку или конец строки.
Если находит закрывающую скобку - возвращает то, до какой позиции она дошла.
Если находит открывающую скобку - запоминает её и вызывает сама себя начиная со следующего символа, принимает возвращённое значение, проверяет, что там закрывающая скобка и заносит эту пару скобок в список.
Если находит конец строки - возвращает то, до какой позиции на дошла.

После вызова этой функции с аргументом "начало строки", все пары скобок окажутся занесены в список, но в неправильном порядке. Следует упорядочить список (хотите - превратив в массив, хотите - так) по возрастанию "номеров позиций скобок видкриваються"... видимо, по первым элементам сохранённых в списке пар.
Abstraction вне форума Ответить с цитированием
Старый 17.05.2013, 17:59   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

нашел открывающую скобку - пихай в стек позицию.
нашел закрывающую скобку - вытаскивай из стека позицию открывающей скобки, приделывай к ней текущую позицию и ложь в список (в котором результат накапливать хочешь).

Держи на прологе без сортировки:
Код:
p([], _, _, R, R):-!.
p([H|T], N, Tmp, L, R):-
	NN is N + 1, (
		[H] = "(", !, p(T, NN, [N|Tmp], L, R)
		; [H] = ")", !, Tmp = [VT|TTmp], p(T, NN, TTmp, [pair(VT, N)|L], R)
		; p(T, NN, Tmp, L, R)
	).
на си оно примерно также должно выглядеть.
Цитата:
[debug] [4] ?- p("А+(45-F(X)*(B-C))", 1, [], [], R).
R = [pair(3, 17), pair(12, 16), pair(8, 10)].
Цитата:
На уровне концепции: завести список пар позиций, как глобальный объект.
глобальный ненужен (и неудобно это), тут ведь нужен тока верхний элемент из этого списка...

Последний раз редактировалось rrrFer; 17.05.2013 в 18:02.
rrrFer вне форума Ответить с цитированием
Старый 17.05.2013, 18:35   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
глобальный ненужен (и неудобно это), тут ведь нужен тока верхний элемент из этого списка...
Моё решение задействует системный стек (рекурсивные вызовы), так что разные активации функции должны иметь доступ к общему объекту для накопления результата, а замыканий в C++ нет.
Abstraction вне форума Ответить с цитированием
Старый 21.05.2013, 18:57   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
#include <iostream>
#include <list>
#include <algorithm>

typedef std::pair<int, int> t_pair;

void f(std::string &str, std::list<t_pair> &res) {
	std::list<int> tmp;
	const int n = str.length();
	for (int idx = 0; idx < n; ++idx) {
		if ('(' == str[idx])
			tmp.push_back(idx);
		if (')' == str[idx]) {
			res.push_back(std::make_pair(tmp.back(), idx));
			tmp.pop_back();
		}
	}
}

int main() {
	std::string str = "А+(45-F(X)*(B-C))";
	std::list<t_pair> t;
	f(str, t);

	for (auto val : t) 
		std::cout << "pair(" << val.first << "," << val.second << ")" << std::endl;
}
Если очень сильно нужны стеки - замени список tmp из функции на стек, он именно так и исопльзуется, ну и отсортируешь список сам )
std::sort поможет, наверное.
ЗЫ. алгоритм тот же что и на прологе.

Цитата:
а замыканий в C++ нет.
ты о лямбдах? - они есть, но причем тут они?

----------
ЗЫ. некропост, но ТС попросил в личке
rrrFer вне форума Ответить с цитированием
Старый 21.05.2013, 20:33   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
ты о лямбдах? - они есть, но причем тут они?
Нет, я о том, что рекурсивная функция, накапливающая результат при каждом вызове, может это делать одним из четырёх способов: или по всей цепочке вызовов в качестве одного из аргументов таскается (передаваемый по ссылке) объект-аккумулятор, или используется возвращаемое значение, или модифицируется глобальный объект, или модифицируется объект, не являющийся глобальным, но существующий на протяжении всех вызовов и доступный при всех вызовах. К примеру, в Python:
Код:
def sum_all(a, b):
  sum = 0
  def recursive(c,d):
    if(c > d):
      return sum
    sum = sum + c
    return recursive(c+1, d)
  return recursive(a,b)
Обратите внимание, что sum - локальная переменная, входящая в замыкание для recursive: все вызовы recursive будут модифицировать одну и ту же sum. Вот этот четвёртый вариант до C++11 недоступен точно, а первый и второй варианты в этой задаче не очень удобны.
Цитата:
ЗЫ. некропост, но ТС попросил в личке
Ох. Вот почему люди не хотят использовать форум? В этих личных сообщениях же чёрт ногу сломит при попытке воссоздать ход беседы хотя бы на десять сообщений назад, и лимит на сообщение - жалкие 4000 символов.
Abstraction вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
стеки lena-tus Паскаль, Turbo Pascal, PascalABC.NET 6 26.11.2013 21:37
С++ стеки student12345 Общие вопросы C/C++ 0 10.12.2011 13:11
стеки ordinary_smile Общие вопросы C/C++ 1 27.11.2011 19:34
Стеки ильшат9 Паскаль, Turbo Pascal, PascalABC.NET 0 18.10.2011 18:43
Стеки... Donim Паскаль, Turbo Pascal, PascalABC.NET 0 13.06.2011 11:33