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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
04.06.2014, 18:05     Простейшая реализация стека и очереди #1
Имеется пример реализации стека:
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++ Реализация стека
Реализация стека C++
реализация стека C++
Реализация стека C++
Реализация стека C++
Преимущества и недостатки при реализации стека, очереди и дека через дин. массива C++
C++ Реализация стека

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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, но данный способ не подходит... Подскажите пожалуйста, что можно с этим сделать?
Yandex
Объявления
07.06.2014, 17:27     Простейшая реализация стека и очереди
Ответ Создать тему
Опции темы

Текущее время: 16:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru