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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2012, 16:43   #1
brainexploded
 
Аватар для brainexploded
 
Регистрация: 14.04.2012
Сообщений: 6
Лампочка Стек и мистика.

Здравствуйте. Решил, вот, стек навелосипедить для практики. Навелосипедил по простому. Работает. Но почему-то, данные извлекаются не в обратном порядке, а в прямом. (!!!)
Вот код.
stack.h
Код:
const int STACK_MAX = 20;
class stack
{
private:
	int *_stack;
	int tail;
public:
	stack();
	~stack();
	void push(int element);
	int pop();
	size_t get_size();
};
stack.cpp
Код:
#include <cstddef>
#include "stack.h"

stack::stack()
{
	_stack = new int[STACK_MAX];
	tail = 0;
}

stack::~stack()
{
	delete[] _stack;
}

void stack::push(int element)
{
	if(tail <= STACK_MAX)
	{
		_stack[tail] = element;
		tail++;
	}
}

int stack::pop()
{
	tail--;
	return _stack[tail];
}

size_t stack::get_size()
{
	return tail;
}
main.cpp
Код:
#include <iostream>
#include "stack.h"

int main(int argc, char *argv[])
{
	stack mystack;
	std::cout << "stack size is " << mystack.get_size() << std::endl;
	std::cout << "pushing 13, 22, 44" << std::endl;
	mystack.push(13);
	mystack.push(22);
	mystack.push(44);
	std::cout << "stack size is " << mystack.get_size() << std::endl;
	std::cout << "stack contains: " << mystack.pop() 
				<< ' ' << mystack.pop()
				<< ' ' << mystack.pop() << std::endl;
	return 0;
}
Makefile
Код:
prog: main.cpp stack.cpp
	g++ -o prog main.cpp stack.cpp
Вывод программы:
Цитата:
alex@home:~/prog/4$ ./prog
stack size is 0
pushing 13, 22, 44
stack size is 3
stack contains: 13 22 44
http://www.lastfm.ru/user/BrainExploded

Последний раз редактировалось brainexploded; 14.04.2012 в 17:22.
brainexploded вне форума Ответить с цитированием
Старый 14.04.2012, 17:41   #2
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

учите матчисть. так и должно быть. стек - пришел последним - уйдешь первым. очередь - пришел первым, уйдешь последним
Kukurudza вне форума Ответить с цитированием
Старый 14.04.2012, 17:45   #3
brainexploded
 
Аватар для brainexploded
 
Регистрация: 14.04.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Kukurudza Посмотреть сообщение
учите матчисть. так и должно быть. стек - пришел последним - уйдешь первым. очередь - пришел первым, уйдешь последним
Стоп! У вас в обоих случаях описан стек! Очередь - это пришёл первым и ушёл первым.

А так всё правильно, я положил 13, 22, 44, а забрать должен 44, 22, 13 - стек, это куда воткнул, оттуда и вынул.
А у меня, каким-то эзотерическим способом, вынимается в том-же порядке, в котором и засовывалось... По принципц очереди.
http://www.lastfm.ru/user/BrainExploded

Последний раз редактировалось brainexploded; 14.04.2012 в 17:50.
brainexploded вне форума Ответить с цитированием
Старый 14.04.2012, 17:57   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Kukurudza Посмотреть сообщение
учите матчисть. так и должно быть. стек - пришел последним - уйдешь первым. очередь - пришел первым, уйдешь последним
Учите матчасть. Очередь - пришёл первым, ушёл первым.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 14.04.2012, 18:10   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

Неопределенный порядок вызова функции pop. И в нормальной реализации стека pop ничего не возвращает.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 14.04.2012 в 18:27.
pproger вне форума Ответить с цитированием
Старый 14.04.2012, 18:20   #6
brainexploded
 
Аватар для brainexploded
 
Регистрация: 14.04.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
Неопределенный порядок вызова функции pop. И в нормальной реализации стека pop ничего не возвращает
а вот так...
Код:
	std::cout << "stack contains: " << mystack.pop(); 
	std::cout << ' ' << mystack.pop();
	std::cout << ' ' << mystack.pop() << std::endl;
выходит правильно.
Цитата:
alex@home:~/prog/4$ ./prog
stack size is 0
pushing 13, 22, 44
stack size is 3
stack contains: 44 22 13
!!!
Спасибо Вам большое! Теперь понял.
А насчёт второй части высказывания - Вы имеете ввиду, что в нормальной реализации, pop пишет в переменную, передаваемую в параметр по ссылке\указателю?
http://www.lastfm.ru/user/BrainExploded
brainexploded вне форума Ответить с цитированием
Старый 14.04.2012, 18:51   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2brainexploded
в нормальной реализации pop() снимает элемент со стека, top() возвращает ссылку на верхний, перед вызовом top() вызываем size(), чтобы убедиться, что есть что снимать
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 14.04.2012, 19:01   #8
brainexploded
 
Аватар для brainexploded
 
Регистрация: 14.04.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2brainexploded
в нормальной реализации pop() снимает элемент со стека, top() возвращает ссылку на верхний, перед вызовом top() вызываем size(), чтобы убедиться, что есть что снимать
Сейчас попробую реализовать

Я правильно понимаю?
Код:
void stack::pop()
{
    if(tail>0)
        --tail;
}
http://www.lastfm.ru/user/BrainExploded
brainexploded вне форума Ответить с цитированием
Старый 14.04.2012, 19:03   #9
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2brainexploded
ну в простейшей реализации да. только с 0 элементом у тебя неоднозначность
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 14.04.2012, 20:56   #10
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

ууух, описочку допустил ну извиняюсь
Kukurudza вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Однако Мистика. vsrmis Общие вопросы Delphi 12 19.01.2011 00:48
Мистика?!!! SNUPY Свободное общение 9 09.06.2010 13:55
Мистика с USB, мышью, компьютером Rembo Компьютерное железо 6 28.02.2009 17:49
Отладка dll с хуком или Мистика на марше Tihon Win Api 8 02.01.2009 13:55
мистика в delphi steck Общие вопросы Delphi 4 27.03.2007 23:57