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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
gjnnfglkf
Сообщения: 4
Зарегистрирован: 13 апр 2017, 14:02

23 апр 2017, 15:29

Создать стек, содержащий слова. В новый стек записать все слова, которые не заканчиваются на заданную букву. Порядок вывода элементов результирующего стека на экран должен совпадать с порядком ввода элементов. Например, если введены aa sab aaa sss qqq saa fff и заданная буква a, то результат должен быть sab sss qqq fff.
Вот примерный код, но по идеи он записывает слова которые не начинаются на заданную букву. И выдает ошибку, помогите пожалуйста исправить ошибки и сделать чтобы выводились слова которые не заканчиваются на заданную букву. (ошибки на картинках)

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

#include <iostream>
#include <string>
using namespace std;
struct stack {
	string inf;
	stack *next;
};
void push(stack *&s, string val)
{
	stack *ins = new stack;
	ins->inf = val;
	ins->next = s;
	s = ins;
}
string top(stack *s)
{
	return s->inf;
}
string pop(stack *&s)
{
	stack *temp = s->next;
	string val = s->inf;
	s = temp;
	delete s;
	return val;
}
bool empty(stack *s)
{
	return (s == NULL);
}
int main()
{
	int n;
	string x;
	stack *s = NULL;
	cout << "Vvedite kol-vo elementov";
	cin >> n;
	cout << "Vvedite elements stack:\n";
	for (int i = 0; i < n; i++)
	
	{
		cin >> x;
		push(s, x);
	}
	char y;
	cout << "Bukva:";
	cin >> y;



	stack *temp = NULL;
	while (!empty(s))
	{
		x = pop(s);
		if (x[0] != y)
			push(temp,pop(s));
	}
	while (!empty(temp))
		cout << pop(temp) << " ";
	system("pause");
	return 0;
}
Изображение
Изображение
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

23 апр 2017, 20:01

Зачем в цикле два раза делаешь pop? Программа падает как раз из-за попытки сделать pop для нулевого указателя на stack.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
gjnnfglkf
Сообщения: 4
Зарегистрирован: 13 апр 2017, 14:02

24 апр 2017, 16:23

Вы про этот кусочек? если убрать pop, то вот что пишет.

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

stack *temp = NULL;
    while (!empty(s))
    {
        x = pop(s);
        if (x[0] != y)
            push(temp,pop(s));
    }
Изображение
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

24 апр 2017, 21:09

Мдааа, то есть понимания кода вообще ноль.

Я имел в виду то, что данные уже извлечены в переменную x. Извлекать их ещё раз не нужно, так как мы просто потеряем следующий данные, либо упадём, если данных уже нет. Вместо этого в push нужно передать значение, которое мы уже вычитали до этого.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить