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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2012, 16:42   #1
zubber94
Пользователь
 
Регистрация: 28.03.2012
Сообщений: 14
По умолчанию с++ очередь

Здравствуйте! С очередьми работать начал совсем недавно, пока что трудновато. Есть задание: "Информационное поле элемента очереди - числовое. Выбросить из очереди отрицательные числа, идущие подряд."

Необязательно писать готвый код решения, мне подойдет просто идея решения, ну и как ее реализовать, в двух словах.

Все, что пока есть
Код:
#include <iostream>
#include <windows.h>
#include <queue>

using namespace std;
typedef int type;

int main()
{
	SetConsoleOutputCP(1251);

	queue<type> myqueue;

	int n;
	cout<<"Введите количество чисел: ";
	cin>>n; cout<<endl;

	type *a=new type[n];

	for(int i=0; i<n; i++)
	{
		cout<<"Введите элемент "<<i+1<<endl;
		cin>>a[i];
		myqueue.push(a[i]);
		cout<<"В очередь добавлен элемент "<<i+1<<endl;
	}

	return 0;
}
zubber94 вне форума Ответить с цитированием
Старый 22.07.2012, 17:56   #2
Петррр
Форумчанин
 
Аватар для Петррр
 
Регистрация: 02.09.2011
Сообщений: 336
По умолчанию

Из текущей очереди никак не выкинуть элементы. Очередь на это она и очередь, что можно получить только первый элемент. Непосредственно через итератор или индексатор по контейнеру не пройтись.
Если ты не можешь найти то, ради чего стоит жить, лучше найти то, за что стоит умереть
Петррр вне форума Ответить с цитированием
Старый 22.07.2012, 17:58   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Идущие подряд - это как? Только те, которые рядом друг с другом? Или те, которые в порядке возрастания? Или ещё как?
eoln вне форума Ответить с цитированием
Старый 22.07.2012, 17:59   #4
zubber94
Пользователь
 
Регистрация: 28.03.2012
Сообщений: 14
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Идущие подряд - это как? Только те, которые рядом друг с другом? Или те, которые в порядке возрастания? Или ещё как?
Идущие подряд, т.е стоящие рядом

Немного добавил в код. Теперь у меня якобы выкидываются все отрицательные, а не только стоящие рядом. Да и программа работает наоборот, т.е. в новую очередь надо сохранить + и непарные -, а туда уходят выбрасываемые -.

Код:
#include <iostream>
#include <windows.h>
#include <queue>

using namespace std;
typedef int type;

int main()
{
	SetConsoleOutputCP(1251);

	queue<type> myqueue;

	int n;
	cout<<"Введите количество чисел: ";
	cin>>n; cout<<endl;

	type *a=new type[n];

	for(int i=0; i<n; i++)
	{
		cout<<"Введите элемент "<<i+1<<endl;
		cin>>a[i];
		myqueue.push(a[i]);
		cout<<"В очередь добавлен элемент "<<i+1<<endl;
	}

	queue<type> newqueue;

	int k;
	bool check=true;
	while(!myqueue.empty())//Основной цикл выталкивания
	{
		k=myqueue.front();
		myqueue.pop();

		if(k<0) check=true;
		else check=false;

		if(check==true)
		{	
			newqueue.push(k);
		}		
	}

	while(!newqueue.empty())//Просмотр выброшенных элементов
	{
		cout<<'\n'<<newqueue.front();
		newqueue.pop();
	}

	return 0;
}

Последний раз редактировалось zubber94; 22.07.2012 в 18:24.
zubber94 вне форума Ответить с цитированием
Старый 22.07.2012, 20:06   #5
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Лень писать код весь, короче идея проста: заведите флаг отрицательного числа и просто делайте проверку вроде этой:
Код:
if(k < 0)
{
   if(check)
   {
        check = false;
        newqueue.push(k);
   }
   else
   {
       check = true;
   }
}
else
{
     newqueue.push(k);
     check = false;
}
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 22.07.2012 в 20:37.
MooNDeaR вне форума Ответить с цитированием
Старый 22.07.2012, 20:37   #6
zubber94
Пользователь
 
Регистрация: 28.03.2012
Сообщений: 14
По умолчанию

Код:
bool check=false;
	while(!myqueue.empty())//Основной цикл выталкивания
	{
		k=myqueue.front();
		myqueue.pop();
		
				
		/*if(k<0&&temp<0) check=true;
		if(check==true)
		{
			newqueue.push(temp);
			newqueue.push(k);
		}
		temp=k;
		check=false;*/
		if(k < 0)
		{
			if(check)
			{
				check = false;
				newqueue.push(k);
			}
			else
			{
				check = true;
			}
		}
		else
		{
			check = false;
		}

	}
Я создаю динам. массив из 5-ти чисел, например. Потом заполняю его так: -1,-2,3,4,5.

Если перед циклом сделать check=true; - записывается "-1".
Если же check=false; - "-2".

Если я считаю очередь в массив, сделаю в нем выборку, а потом запишу обратно уже отредактированную очередь, будет ли это технически нарушением условия задачи?
zubber94 вне форума Ответить с цитированием
Старый 22.07.2012, 20:46   #7
@SSV
Пользователь
 
Регистрация: 22.07.2012
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Петррр Посмотреть сообщение
Из текущей очереди никак не выкинуть элементы. Очередь на это она и очередь, что можно получить только первый элемент. Непосредственно через итератор или индексатор по контейнеру не пройтись.
Жаль...............
Правда у всех своя, а истину не знает ни кто.
@SSV вне форума Ответить с цитированием
Старый 23.07.2012, 02:33   #8
ERAGORN
Пользователь
 
Аватар для ERAGORN
 
Регистрация: 02.01.2012
Сообщений: 46
По умолчанию

Код:
#include <iostream>
#include <queue>

using namespace std;


int main()
{
    typedef int type;

    cout<<"Введите количество чисел: ";
    int n;
    cin >> n;
    cout << endl;

    queue<type> myqueue;

    for ( int i = 1; i <= n; ++i ){
        cout << "Введите элемент " << i << ":  ";
        type temp;
		cin >> temp;
		myqueue.push(temp);
		cout << "В очередь добавлен элемент " << i << endl;
    }
    cout << endl;

    queue<type> newqueue;
    while ( !myqueue.empty() ){
        type temp_1 = myqueue.front();
        myqueue.pop();
        if ( temp_1 < 0 ){
            if ( !myqueue.empty() ){
                type temp_2 = myqueue.front();
                myqueue.pop();
                if ( temp_2 < 0 ){
                    type temp_3 = myqueue.front();
                    do{
                        temp_3 = myqueue.front();
                        myqueue.pop();
                    }while ( !myqueue.empty() && temp_3 < 0 );
                    if ( temp_3 >= 0 )
                        newqueue.push(temp_3);
                }else{
                    newqueue.push(temp_1);
                    newqueue.push(temp_2);
                }
            }else newqueue.push(temp_1);
        }else newqueue.push(temp_1);
    }

    while ( !newqueue.empty() ){
		cout << newqueue.front() << '\n';
		newqueue.pop();
    }
	cout << endl;

    cin.get();
    return 0;
}
ERAGORN вне форума Ответить с цитированием
Старый 25.07.2012, 00:01   #9
zubber94
Пользователь
 
Регистрация: 28.03.2012
Сообщений: 14
По умолчанию

Спасибо большое за труд, Эрагон.

можно закрыть тему.
zubber94 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очередь Artem_Kow C# (си шарп) 16 05.04.2012 22:19
очередь qwer1994 Паскаль, Turbo Pascal, PascalABC.NET 0 29.02.2012 23:12
Очередь Си svetikzo Помощь студентам 0 23.01.2010 10:03
Очередь skiffter Помощь студентам 2 03.12.2009 17:39
Очередь Юлькин Общие вопросы C/C++ 4 30.05.2009 16:00