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

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

04.06.2014, 18:05. Просмотров 2051. Ответов 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; и изменить (как?) алгоритм ввода, всё остальное останется таким же.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2014, 18:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Простейшая реализация стека и очереди (C++):

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

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

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

2 Стека / 2 очереди. Вставка в середину пропущенного элемента арифметической прогрессии
Добрый день, форумчане! Нужно решить задачу, используя 2 стека или же 2...

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

Реализация стека
вот такие ошибки при реализации: stack.h(26) : error C2953: 'Stack' : class...

2
Kastaneda
Jesus loves me
Эксперт С++
4760 / 2963 / 341
Регистрация: 12.12.2009
Сообщений: 7,524
Записей в блоге: 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;
}
2
FinalQ
0 / 0 / 1
Регистрация: 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, но данный способ не подходит... Подскажите пожалуйста, что можно с этим сделать?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2014, 17:27
Привет! Вот еще темы с решениями:

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

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

Реализация стека
Здравствуйте, помогите пожалуйста с реализацией стека без использования STL....

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


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

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

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