Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Pushok12
1 / 1 / 2
Регистрация: 08.09.2015
Сообщений: 16
#1

Стек на основе массива, реализовать функцию resize - C++

08.09.2015, 19:00. Просмотров 491. Ответов 2
Метки нет (Все метки)

1) Добавить деструктор, конструктор копии и перегрузку операции присваивания.
2) Используя функцию resize, изменить функцию добавления элементов так, чтобы новые элементы всегда можно было добавлять в стек. Сделать функцию resize закрытой.

Помогите пожалуйста, до меня не доходит как изменить функцию push() и не понимаю зачем нужен конструктор копий?

stack_int.h
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
#ifndef STACK_H
#define STACK_H
 
#include <iostream>
 
using namespace std;
 
class Stack_int
{
public:
    
    Stack_int(int k=10);
    ~Stack_int(){};
    void printstack();
 
    void push(int value);
 
    void pop(int &value);
    
    void resize(int n_add=100);
 
private:
    
    int size, top;
    int *stackPtr;
    bool isEmpty();
    bool isFull();
 
};
 
#endif


stack_int.cpp
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
#include "stack_int.h"
Stack_int::Stack_int(int k)
{
    size=k;
    top=-1;
       stackPtr=new int [size];
}
 
bool Stack_int::isEmpty()
{
    return top==-1;
}
 
bool Stack_int::isFull()
{
    return top==size-1;
}
 
void Stack_int:: printstack()
{
    cout << endl;
    if (!isEmpty())
    {
        for (int i=0; i<=top; i++)
            cout << stackPtr[i]<< endl;
    }
    else
        cout << "stack is empty" << endl;
 
    cout << endl;
}
 
void Stack_int:: push(int value)
{
    if (!isFull())
    {
        top+=1;
        stackPtr[top]=value;
    }
    else
    {
        cout << "stack is full, cannot push" << endl;
    }
}
void Stack_int:: pop(int &value)
{
    if (!isEmpty())
    {
        value=stackPtr[top];
        top-=1;
    }
    else
    {
        cout << "stack is empty, cannot pop" << endl;
    }
}
void Stack_int::resize(int n_add)
{
    int *temp=new int[size+n_add];
    size+=n_add;
 
    for (int i=0; i<=top; i++)
        temp[i]=stackPtr[i];
    delete [] stackPtr;
    stackPtr=temp;
}


main.cpp
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
#include <iostream>
#include "stack_int.h"
using namespace std;
 
int main()
{
    Stack_int k(5);
    int i, value;
    k.printstack();
    k.resize();
    for (i=0; i<6; i++)
        k.push(i-1);
    k.printstack();
    k.pop(value);
    cout << "value is " << value << endl<<endl;
    for (i=0; i<6; i++)
    {
        k.pop(value);
        cout << value << endl;
    }
    k.printstack();
 
    cout << "Hello World!" << endl;
    return 0;
}

http://www.cyberforum.ru/cpp-beginners/thread781806.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2015, 19:00
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Стек на основе массива, реализовать функцию resize (C++):

Реализовать функцию resize
Функция resize принимает на вход три аргумента: указатель на область памяти,...

Реализовать функцию resize
Здравствуйте! Есть задача на динамическую память. Не очень понимаю как делать....

Создать базовый класс список и реализовать на его основе стек и очередь
2. Создать базовый класс список. Реализовать на базе списка стек и очередь с ...

Стек на основе массива
Банально: создать, добавить, удалить. Без своих &quot;написаний&quot; никак, дело в...

Стек на основе статического массива
Здравствуйте! Помогите пожалуйста выполнить задание. Сама уже весь форум...

2
Геомеханик
784 / 591 / 937
Регистрация: 26.06.2015
Сообщений: 1,407
08.09.2015, 22:56 #2
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
#include <iostream>
 
 
template<typename T>
class Stack {
private:
    T*     arr;
    size_t cnt;
    size_t size;
public:
    Stack(void):arr(NULL), cnt(0), size(16){}
    Stack(const Stack& s):arr(NULL), cnt(0), size(16){
        this->copy(s);
    }
    ~Stack(){
        this->clear();
    }
public:
 
    bool push(const T& val){
        if(this->resize(1)){
            arr[cnt++] = val;
            return true;
        }
        return false;
    }
 
    void copy(const Stack& s){
        if((this != &s) && !s.isEmpty()){
            this->clear();
            if(this->resize(s.cnt)){
                const T* e = s.arr + s.cnt;
                for(const T* p = s.arr; p != e; ++p)
                    this->push(*p);
            }
        }
    }
 
    void pop(void){
        if((cnt > 0) && (--cnt == 0))
            this->clear();
    }
 
    void clear(void){
        if(arr != NULL)
            delete[] arr;
        arr  = NULL;
        cnt  = 0;
        size = 16;
    }
 
    T& top(void){ return arr[cnt - 1]; }
    T& top(void) const { return arr[cnt - 1]; }
 
    bool isEmpty(void) const {
        return (arr == NULL);
    }
 
    size_t getSize(void) const {
        return cnt;
    }
 
    Stack& operator = (const Stack& s){
        this->copy(s);
        return *this;
    }
 
public:
 
    int resize(size_t N){
        if(arr == NULL){
            if(N > size)
                size = N + 1;
            arr = new (std::nothrow) T[size];
            if(arr == NULL)
                return 0;
        } else if((cnt + N) > size){
            T* ptr = new (std::nothrow) T[cnt + N + size];
            if(ptr == NULL)
                return 0;
            for(size_t i = 0; i < cnt; ++i)
                ptr[i] = arr[i];
        
            delete[] arr;
            arr  = ptr;
            size = cnt + N + size;
        }
        return 1;
    }
};
 
 
int main(void) {
    Stack<int> s;
    for(int i = 0; i < 10; ++i)
        s.push(i);
 
    while(! s.isEmpty()){
        std::cout << s.top() << ' ';
        s.pop();
    }
    return 0;
}
Пример работы кода
0
Pushok12
1 / 1 / 2
Регистрация: 08.09.2015
Сообщений: 16
09.09.2015, 20:24  [ТС] #3
Спасибо большое!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2015, 20:24
Привет! Вот еще темы с решениями:

Стек на основе динамического массива
Надо написать стек на основе динамического массива. Как выделить память под...

Написать стек на основе одномерного массива
Пробую написать стек на основе одномерного массива. Скажите что не так делаю....

Создать стек целых чисел на основе статического массива.
Создать стек целых чисел на основе статического массива. Реализовать методы :...


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

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

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