Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ДиманБ
0 / 0 / 0
Регистрация: 12.03.2013
Сообщений: 21
#1

класс StackInt - C++

18.04.2013, 21:27. Просмотров 233. Ответов 0
Метки нет (Все метки)

помогите сделать по образцу:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
using namespace std;
 
// структура, описывающая один узел:
struct Node
{
    int data; // элемент данных
    Node *next, *prev; // указатели на следующий и предыдущий узел
};
 
// класс для работы со списком:
class ListInt
{
/* указатели на начало, конец списка  и на текущий узел (указатель на текущий узел используется многими функциями, поэтому объявим его как элемент данных класса): */
    Node *front;
    Node *back;
    Node *token;
// функции ввода-вывода:
    friend ostream& operator << (ostream&, ListInt&);
    friend istream& operator >> (istream&, ListInt&);
    public:
        ListInt() {back = front = token = NULL;} 
// конструктор по умолчанию
        ListInt(int, int*); // основной конструктор
        ListInt(const ListInt&); // конструктор копирования
        ~ListInt(); // деструктор
        bool Empty() { return front == NULL ? true: false;} 
        // проверка, пустой ли список 
        void Add(int val); //добавляет элемент в конец списка
        int Gettoken(); // текущий элемент данных
        int GetSize(); // количество элементов списка
        ListInt& operator () (int n, int v); 
// операция, которая заменяет элемент с номером n на заданное значение v
// кроме того операция () является вспомогательной для операции +
        ListInt& operator + ();
// операция, которая добавляет элемент в список в текущей позиции
};
// Определение функций:
// Основной конструктор
ListInt :: ListInt (int n, int* val) 
// параметрами являются количество элементов массива и указатель на массив
{
    back = front = token  = NULL;
    for (int i=0; i<n; i++)
        Add(val[i]); // добавляем элементы массива в список
}
// конструктор копирования:
ListInt :: ListInt(const ListInt& list)
{
    back = front = token = NULL;
    Node* ptr = list.front;
 // указатель на текущий элемент копируемого объекта
    while  (ptr)
    {
        Add(ptr->data); 
// добавляем в список элемент из копируемого списка
        ptr = ptr->next; 
// переходим к следующему элементу копируемого списка
    }
}
 
//  функция, которая добавляет элемент в конец списка:
void ListInt :: Add(int val)
{
    Node *p = new Node; // создаем новый узел
    p->data = val; // записываем элемент данных
    if(Empty()) // если список еще пуст
    {
        front = back = p; 
// добавляемый элемент становится первым и последним
        p->next = p->prev = NULL; 
        //  предыдущего и последующего элементов нет
    }
    else
    {
        back->next = p;  // привязываем новый узел к последнему
        p->prev=back; p->next = NULL; // определяем значения указателей
        back=p; // новый узел становится последним
    }
}
 
//функция ввода:
istream & operator >> (istream &is, ListInt& q)
{
   q.~ListInt(); // Удаляем ранее существовавший список
   int a; int k;
   cout<<"Сколько элементов будете вводить? ";
   is >> k;
   for(int i=0; i<k; i++)
   {
    cout << i+1 << ": "; is >> a;
    q.Add(a);
   }
   return is;
}
 
//функция, которая определяет значение текущего элемента
int ListInt :: Gettoken()
{
    if (token == NULL) token = front;
    if (token)
    {
        int rv = token->data; //считываем значение из текущего узла
        token = token->next; //текущим становится следующий узел
        return rv;
    }
    else return 0;
}
 
// функция вывода:
ostream& operator << (ostream& os, ListInt& q)
{
    Os << "< ";
    q.token = q.front; // переходим в начало списка q
    while(q.token) // пока список не закончен
    {
        if (q.token != q.front)
            cout <<", ";
        os << q.Gettoken(); // выводим очередной элемент списка
    }
    return os << ">" << endl;
}
 
//деструктор:
ListInt :: ~ListInt()
//Удаляет элементы cписка с конца:
{
    while (back) // если список не пустой
    {
        token = back; // берем последний узел
        back = back->prev; // предпоследний узел делаем последним
        delete token; // удаляем узел
        if (token==front) break; 
// если удалили первый узел, то останавливаем цикл
   }
}
 
// функция возвращает количество элементов списка
int ListInt::GetSize()
{
    int count=0;
    token = front;
    while (token)
    {
        count++; // увеличиваем счетчик
        token = token->next; // переходим к следующему узлу
    }
    return count;
}
 
// операция ():
ListInt& ListInt:: operator () (int n, int v)
// параметрами функции являются номер элемента и новое значение этого 
// элемента
{       
    Node *ptr;
    if (n <= GetSize())
    {
        // находим адрес элемента с заданным номером:
        ptr = front;
        for (int i=1; i<n; i++)
            ptr = ptr->next;
        Node* tmp = new Node; 
        // создаем новый узел (он будет хранить копию заменяемого узла)
        tmp->data = ptr->data; // копируем содержимое узла
        tmp->prev = ptr->prev; 
        tmp->next = ptr->next; 
        front->prev = tmp; // временно подвязываем копию перед первым узлом списка
        ptr->data = v; // заменяем значение текущего элемента на v
    }
    else // Если вставляем новый узел в конец списка
    {
        Node* tmp = new Node; // Создаем новый узел
        tmp->data = v;
        tmp->prev = back;
        tmp->next = NULL;
        front->prev = tmp; 
// временно подвязываем его перед первым узлом списка
        ptr = back;
        back = tmp;
    }
    token = ptr;
    return *this; // возвращаем текущий объект
}
 
// операция +
ListInt& ListInt:: operator + ()
{
    token->next = front->prev;
 /* за текущим узлом вставляем тот, который мы сохранили перед первым элементом */
    front->prev = NULL; // теперь перед первым элементом ничего не стоит
    return *this; // возвращаем указатель на текущий объект
}
//=========================================================
int main()
{
    //Настройки шрифтов и региональных стандартов: 
    if(SetConsoleCP(1251)==0)
    //проверка правильности установки кодировки символов для ввода
    {
        cerr<<"Fialed to set codepage!"<<endl;
    /* если не удалось установить кодовую страницу, вывод сообщения об ошибке */
    }
    if(SetConsoleOutputCP(1251)==0)//тоже самое для вывода
    {
        cerr<<"Failed to set OUTPUT page!"<<endl;
    }
    int a[]={1, -2, 3, -4, 5};
    ListInt lista(5, a);
    cout<<"Пример использования основного конструктора: \n";
    cout << lista;
 
// пример использования операций () и + :
    do
    {
        ListInt list;
        cin >> list;
        cout << list;
        int data, n;
        cout << "Задайте новый элемент списка ";
        cin >> data;
        cout << "Какой элемент заменить? ";
        cin >> n;
        if (n < 1 || n > list.GetSize())
            cout << "Неверный номер\n";
        else
        {
            list(n, data); // заменяем n-ый элемент на data
            cout << list;
        }
 
        cout << "Задайте новый элемент списка ";
        cin >> data;
        cout << "Под каким номером вставить? ";
        cin >> n;
        if (n < 1 || n > list.GetSize()+1)
            cout << "Неверный номер\n";
        else
        {
            +list(n, data); //  вставляем элемент data на n-ое место
            // операция () выполняется перед операций +
            cout << list;
        }
    } while (_getch() != 27);
    return 0;
}
надо Создать класс StackInt для работы со стеком целых чисел. В качестве членов-данных рекомендуется брать два элемента (определяющие начало и конец стека) самоссылочной структуры следующего вида:
struct Node { int data; Node *next; };
Определить в этом классе функции-члены класса, обеспечивающие: инициализацию стека, добавление элементов в стек, удаление элемента из стека.
Кроме того, определить операторные функции для ввода и вывода стека.
Дополнительно определить функцию-член этого класса, которая заменяет элемент данных стека с заданным номером на новое значение, и операторную функцию -, которая находит минимальный элемент данных стека.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2013, 21:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос класс StackInt (C++):

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template &lt;class T&gt; class matrix { friend class diagonal; ...

Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами - C++
Здравствуйте! Никак не могу продумать структуру этой программы. Проходим наследование, но я все равно не знаю, как его здесь применить. Как...

Отдельно класс данных, класс формул и главный класс - C++
Здравствуйте! У меня есть три вопроса. Первый вопрос. Скажите пожалуйста! Правильный ли это подход к созданию приложений :...

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число" - C++
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию сложения пар (a,b)+(c,d) =(a+b,c+d)...

Класс, производный класс, паблик-класс - C++
Задание: Создать класс колесо, которое имеет радиус. Определить конструкторы и метод доступа. Создать класс машин, содержащий класс колесо....

Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки машин ”: марка - C++
Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.04.2013, 21:27
Привет! Вот еще темы с ответами:

Абстрактный класс CGraphicsObject, его наследник - базовый класс CPoint, и класс - наследник от CPoint - C++
Всем доброй ночи! Очень нужна помощь и по мере возможности разъяснения на темы: абстрактный класс в задании(что он из себя представляет и...

Иерархия геометрических объектов: клас точка->класс квадрат->класс прямоугольник - C++
Иерархия геометрических объектов: класс точка-&gt;класс квадрат-&gt;класс прямоугольник. Построить эту иерархию наследованием.. Прошу помочь -...

Создать класс Элемент списка (Node), а затем класс Список (List) - C++
Задание: Создать класс Элемент списка (Node), а затем класс Список (List). В зависимости от варианта список должен быть одно или...

Ошибка в выводе данных, класс выводит правильно, а класс в классе - нет - C++
Неизвестная для меня проблема. Класс выводит данные правильно из Consigment, а вот третий экземпляр класса, работает не верно, если...


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

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

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