Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
#1

Простейшая реализация стека и очереди - C++

04.06.2014, 18:05. Просмотров 1695. Ответов 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
#include <cstdlib>
#include <iostream>
using namespace std;
 
class Stack {
  private:
    int* arr; // Указатель на динамический массив с элементами стека
    int* top; // Указатель на верх стека
    int size; // Емкость стека
 
 
 Stack(const Stack& s) { // Копирующий конструктор
        this->size = s.size;
        this->arr = new int[s.size]; // Создаём НОВЫЙ динамический массив
        this->top = arr;
        int* p = s.arr; // Отдельный указатель на элементы старого массива
        while (p < s.top) {
            *top++ = *p++; // Копируем элементы и позицию в новый массив
        }
    }
bool isEmpty() { // Метод проверяющий пуст ли стек
        if (top <= arr) {
            return true;
        } else {
            return false;
        }
    }
bool isFull() { // Метод проверяющий полон ли стек
        if (top - arr >= size) {
            return true;
        } else {
            return false;
        }
    }    
void push(int val) { // Метод добавляющий элемент в стек
        if(!isFull()) {
            *top = val;
            top++;
        } else {
            cout << "Stack full!" << endl; // Стэк полон
        }
    }
int pop() { // Метод извлекающий верхний элемент из стека
        if(!isEmpty()) {
            top--;
            return *top;
        } else {
            return 0; // Стэк пуст, вернём нуль
        }
    }
void printStack() { // Метод выводящий элементы стека в строку
        int* p = arr;
        while (p < top) {
            cout << *p++ << ' ';
        }
        cout << endl;
    } 
~Stack() { // Деструктор
        delete[] arr; // Освобождает память от массива
    };
};
 
int main(void) {
    Stack s(3); // Создаём стек емкостью в 3 элемента
    s.push(1);
    s.push(2);
    s.push(3);
    s.push(66); // Увидим сообщение о том, что стек полон
    //Stack t(s); // Создаём второй стек, копируя первый
    //cout << t.pop() << endl; // Извлекаем и выводим верхний элемент
    //t.push(99); // Добавляем другой элемент на освободившееся место
    s.printStack(); // Увидим 3 элемента стека
    cin.get();
    return 0;
}
В ходе ознакомления с примером возник ряд вопросов:
1) при вводе элементов в порядке 1 2 3, выводит стек в том же порядке (1 2 3), а по идее должен в порядке 3 2 1 (последним пришёл — первым вышел), не могу собственно найти ошибку, ткните носом пожалуйста.
2) по этому же примеру необходима реализация очереди, для этого я так понимаю нужно добавить в класс int* bot; и изменить (как?) алгоритм ввода, всё остальное останется таким же.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2014, 18:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Простейшая реализация стека и очереди (C++):

Реализация стека/очереди для выдачи номеров пар скобок в тексте - C++
Пункт а я решил: добавляем номер символа в стек, если встретился символ &quot;(&quot;, когда встречаем &quot;)&quot;, то печатаем элемент стека (номер...

Нужны примеры двусвязного списка,очереди или стека - C++
Здравствуйте, мне нужны примеры создания стеков,очереди (дек) с двусвязными списками. Напишите пожалуйста код для таких классов.

Создание линейной структуры данных типа очереди или стека - C++
Здравствуйте, форумчане. Прошу помочь с заданием:

Преимущества и недостатки при реализации стека, очереди и дека через дин. массива - C++
Доброго времени суток! 1) Назовите преимущества и недостатки реализации очереди с помощью динамического массива. 2) Назовите...

Реализация стека - C++
Подскажите, как создать класс, который реализует стек? А также методы включения и выключения элементов?

Реализация стека - C++
Реализация стека (добавить 1 элемент, вытащить 1 элемент в стеке, определить, когда стек будет пустой). Помогите пожалуйста написать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,270
Записей в блоге: 2
Завершенные тесты: 1
04.06.2014, 18:09 #2
Цитата Сообщение от FinalQ Посмотреть сообщение
1) при вводе элементов в порядке 1 2 3, выводит стек в том же порядке (1 2 3), а по идее должен в порядке 3 2 1 (последним пришёл — первым вышел), не могу собственно найти ошибку, ткните носом пожалуйста.
метод печати кривой
C++
1
2
3
4
5
6
7
void printStack() { // Метод выводящий элементы стека в строку
        int* p = arr;
        while (p < top) {
            cout << *p++ << ' ';
        }
        cout << endl;
}
должно быть
C++
1
2
3
4
5
6
7
void printStack() { // Метод выводящий элементы стека в строку
        int* p = top -1;
        while (p >= arr) {
            cout << *p-- << ' ';
        }
        cout << endl;
}
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
07.06.2014, 17:27  [ТС] #3
Возникла некоторая проблемка:
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
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
class Stack 
{
  private:
    int* arr;
    int* top;
    int size;
  public:
    Stack(int s = 10) 
    {
        this->size = s;
        arr = new int[s];
        top = arr;
    }
    Stack(const Stack& s) 
    {
        this->size = s.size;
        this->arr = new int[s.size];
        this->top = arr;
        int* p = s.arr;
        while (p < s.top) {*top++ = *p++;};
    }
 
bool isEmpty() 
    {
        if (top <= arr) 
        {return true;} else {return false;};
    }
 
bool isFull() 
    {
        if (top - arr >= size) {return true;} else {return false;}
    }
    
void push(int val) 
    {
        if(!isFull()) 
        {
            *top = val;
            top++;
        } else {cout << "Stek polnii!" << endl;};
    }
 
int pop() 
    {
        if(!isEmpty()) 
        {
            top--;
            return *top;
        } else {return 0;};
    }
 
void printStack() 
    {
        int* p = top -1;
        while (p >= arr) {cout << *p-- << ' ';};
        cout << endl;
    }
 
~Stack() 
    {
        delete[] arr;
    }
};
 
int main()
{
    int n,i,size;
    int x,y,xy;
    cout<<"1) Add elements\n";
    cout<<"2) See all elements\n";
    cout<<"3) Find element\n";
    cout<<"4) Delete element\n";
    cout<<"5) Exit\n";
    //Stack data(10);
    while (true)
    {
    int key;
    cin>>key;
    switch (key)
    {
        case 1: {cout<<"Skolko elementov vvodit?\n";
                cin>>n;
                Stack data(n);
                cout<<"Vvod nachat.\n";
                for (int i=0;i<n;i++)
                {
                cin>>x; 
                data.push(x);
                }
                cout<<"Vvod okonchen.\n";
                break;}
        case 2: {//Stack tmp(data);
                cout<<"Vivod nachat.\n";
                data.printStack();
                cout<<"Vivod okonchen.\n";
                break;}
/*        case 3: cout<<"Zadaite interval poiska:\n";
                cin>>x>>y;
                tmp=data;
                cout<<"Poisk nachat.\n";
                i=0;
                while (!tmp.empty()) 
                {
                if ((tmp.front().length()<x.length()) 
                or (tmp.front().length()>y.length())) 
                {cout<<tmp.front()<<"\n"; i++; xy=tmp.front(); break;};
                tmp.pop();
                }
                if (i==0) {cout<<"NET SOVPADENII!\n";};
                cout<<"Poisk okonchen.\n"; 
                break;
        case 4: cout<<"Naidenii element: "<<xy<<"\n";
                i=0;
                tmp=data;
                while (!tmp.empty()) 
                {
                if (xy==tmp.front()) {break;} else {i++;};
                tmp.pop();
                }
                tmp=data;
                size=tmp.size();
                for (int ii=0;ii<size;ii++)
                {
                if (ii!=i-1) {temp.push(tmp.front());};
                tmp.pop();
                }
                data=temp;
                cout<<"Ydalenie okoncheno.\n"; 
                break;*/
        case 5: exit(0); break;
    }
    }
    return 0;
}
в case 1 если не ставить скобки выдает ошибку "jump to case label [-fpermissive]", если ставить, то "'data' was not declared in this scope".
Без ошибок получается запустить программу есть вывести Stack data(n); за case, но данный способ не подходит... Подскажите пожалуйста, что можно с этим сделать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2014, 17:27
Привет! Вот еще темы с ответами:

Реализация стека - C++
вот такие ошибки при реализации: stack.h(26) : error C2953: 'Stack' : class template has already been defined liststack.h(10) : error...

Реализация стека - C++
Написать программу, реализующую стек с информацией о сотрудниках и отображающую стек в порядке возрастания возраста сотрудника

Реализация стека - C++
Помогите создать структуру данных типа &quot;стек&quot;, элементы которого занимают 10 кб. Операции, вы-полняемые над стеком: проверить,...

Реализация стека - C++
Всем доброго времени суток! Нашел в на просторах интернета исходник реализации стека. Но не совсем понятен код. Что бы понять - я...


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

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

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