Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
BloodyCamper
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 35
1

Перегрузка операторов для работы со стеком

28.05.2015, 15:05. Просмотров 969. Ответов 9
Метки нет (Все метки)

Текст задания:
Создать объект "динамический стек". Перегрузить операции +, -, +=, -= для выполнения манипуляций со стеком.

Вот реализация стека:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Stack {
public:
  Stack( int capacity )
  : _stack( capacity ), _top( 0 ) {}
  bool pop(int &top_value );
  bool push( int value );
  bool full();
  bool empty();
  void display();
  int size();
private:
  int _top;
  vector< int > _stack;
};
inline int Stack::size() { return _top; };
inline bool Stack::empty() { return _top ? false : true; }
inline bool Stack::full() {
   return _top < _stack.size()-1 ? false : true;
}
bool Stack::pop( int &top_value ) {
   if ( empty() )
     return false;
  top_value = _stack[ --_top ];
  cout << "Stack::pop(): " << top_value << endl;
 
  return true;
}
 
bool Stack::push( int value ) {
  cout << "Stack::push( " << value << " )\n";
  if ( full() )
    return false;
  _stack[ _top++ ] = value;
  return true;
}
void Stack::display() {
   cout << "( " << size() << " )( bot: ";
   for ( int ix = 0; ix < _top; ++ix )
   cout << _stack[ ix ] << " ";
   cout << " :top )\n";
}


Никак не могу разобраться с перегрузкой, поэтому и прошу перегрузить операторы таким образом:
+ -> push
- -> pop
+= -> full
-= -> empty
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2015, 15:05
Ответы с готовыми решениями:

Перегрузка операторов для работы с матрицами
нужно перегрузить оператор + для сложения двух матриц. Всё сделал, и всё...

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. ...

Перегрузка операторов для list
Как перегрузить операторы вывода в поток и доступа по индексу для list?

Перегрузка операторов не для объектов
Можно ли так делать? Потому что в таком случае вызывается не мой оператор, а...

Перегрузка операторов для классов
Определить класс описывающий вектор в пространстве. Для класса перегрузить...

9
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
28.05.2015, 15:24 2
А напишите-ка, как вы хотели бы использовать перегруженные операторы? Ну, как вы это себе представляете?
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
28.05.2015, 15:27 3
C++
1
2
Stack mStack;
mStack + 13; // mStack.push_back(13); ?
0
BloodyCamper
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 35
28.05.2015, 15:34  [ТС] 4
2mymedia
Если честно, я не очень хорошо понял текст задания, но после вашего сообщения до меня дошло, что манипуляции со стеком это не добавление/удаление из него элементов, а операции с самими элементами стэка, мол
+ - сумма двух элементов стека
- - соответственно разность
+= - увеличение элемента
-+ - уменьшение элемента
Однако как это реализовать я все равно не представляю.
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
28.05.2015, 15:39 5
Цитата Сообщение от BloodyCamper Посмотреть сообщение
+ - сумма двух элементов стека
Переспросите лучше - стек не предоставляет интерфейс сложения индексируемых элементов.

pop или push - весь профит)))
0
BloodyCamper
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 35
28.05.2015, 15:44  [ТС] 6
Поскольку в задании не уточнено, то любой из операторов можно использовать для любой манипуляции со стеком, так что pop или push тоже сойдет.
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
28.05.2015, 15:52 7
Лучший ответ Сообщение было отмечено BloodyCamper как решение

Решение

Ну, можно сделать вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int operator+ (Stack& s, int val) {
  int el;
  s.pop(el);
  s.push(el);
  return el + val;
}
int operator- (Stack& s, int val) {
  int el;
  s.pop(el);
  s.push(el);
  return el - val;
}
Stack& operator+= (Stack& s, int val) {
  int el;
  s.pop(el);
  s.push(el + val);
  return s;
}
Stack& operator-= (Stack& s, int val) {
  int el;
  s.pop(el);
  s.push(el - val);
  return s;
}
Стек передаётся по ссылке, чтобы не было лишнего копирования.
Использовать эти операторы можно, например, так
C++
1
2
3
4
Stack cont;
cont.push(3);
cont += cont - 5;
// в стеке теперь лежит 1
1
BloodyCamper
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 35
28.05.2015, 16:11  [ТС] 8
Спасибо, а можно немного поподробнее про принцип работы каждого из перегруженных операторов?
0
mymedia
193 / 193 / 120
Регистрация: 27.05.2011
Сообщений: 544
28.05.2015, 16:21 9
Вызов перегруженного оперетора — это то же самое, что и вызов функции с особым именем, начинающимся с ключевого слова operator
Операторы можно перегружать как функции-члены, т.е. в самом классе. Либо, если нет возможности изменить класс, можно перегрузить оператор простой функцией, как я сделал.

Например, функцию
C++
1
int operator+ (Stack& s, int val);
Можно вызывать так:
C++
1
2
3
4
Stack a;
a + 1;
operator+ (a, 1);  // то же самое
1 + a;  // а вот так нельзя — перегруженные операторы не будут ассоциативны, если вы этого вручную не пропишете
0
BloodyCamper
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 35
28.05.2015, 16:29  [ТС] 10
Спасибо большое за помощь
0
28.05.2015, 16:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2015, 16:29

Перегрузка операторов для списков
Как сделать перегрузку оператора умножить (оператор возвращает адрес первого...

Перегрузка операторов для контейнера
Доброго времени суток. Просматривая STL, в ветке вектора наткнулся на такую...

Перегрузка операторов для класса
class A { private: size_t i; public: size_t i_get() { return...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru