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

Реализация стека с помощью массива - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.60
DebieCooper
 Аватар для DebieCooper
34 / 34 / 1
Регистрация: 12.10.2011
Сообщений: 285
20.12.2011, 18:23     Реализация стека с помощью массива #1
Извиняюсь. Неправильно тему назвал
Стек – KStack
Методы:
конструкторы, деструктор;
операции: >>, <<, +, +=, =, ==, !=
функции:
IsEmpty(),
Size(),
Clear() - удалить все элементы стека,
Top() - получить значение верхнего элемента стека,
Push() – добавить новый элемент стек,
Pop() – удалить элемент из стека,
Swap() - обменять значения (т.е. стеки).

Задание:
Стек реализовать на массиве;
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 18:23     Реализация стека с помощью массива
Посмотрите здесь:

C++ Реализация стека
реализация динамического стека C++
C++ Реализация стека
Реализация стека C++
реализация стека C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Питекантроп
 Аватар для Питекантроп
246 / 140 / 6
Регистрация: 14.06.2010
Сообщений: 340
20.12.2011, 20:22     Реализация стека с помощью массива #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
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
template <class T>
class Stack
{
private:
        T * arr;
        int size, len;
        void new_size(int s)
        {
                if (s<=0) return;
                T * new_arr = new T[s];
                int min_s = s<len?s:len;
                for (int i = 0; i<min_s; i++) new_arr[i] = arr[i];
                delete[] arr;
                size = s;
                arr = new_arr;
        }
 
public:
        Stack()
        {
                len = 0;
                arr = new T[size = 5];
        }
 
        Stack(Stack & st)
        {
                arr = new T[size = st.size];
                len = st.len;
                for (int i = 0; i < len; i++) arr[i] = st.arr[i];
        }
 
        ~Stack()
        {
                delete[] arr;
        }
 
        int Size()
        {
                return len;
        }
 
        void Push(T & x)
        {
                if (len == size) new_size(size<<1);
                arr[len++] = x;
        }
        T Pop()
        {
                if (size > 10 && len < size>>2) new_size(size>>1);
                if (len == 0) return arr[len];
                return arr[--len];
        }
        T Top()
        {
                return arr[len];
        }
        void Clear()
        {
                delete arr;
                len = 0;
                arr = new T[size = 5];
        }
 
        bool IsEmpty()
        {
                return len == 0;
        }
 
        Stack<T> operator + (Stack<T> & st)
        {
                Stack<T> S;
                S.new_size(len + st.len + 10);
                for (int i = 0; i<len; i++) S.arr[S.len++] = arr[i];
                for (int i = 0; i<st.len; i++) S.arr[S.len++] = st.arr[i];
                return S;
        }
        Stack<T> operator + (T & x)
        {
                Stack<T> S;
                S.new_size(len + 10);
                for (int i = 0; i<len; i++) S.arr[S.len++] = arr[i];
                S.arr[S.len++] = x;
                return S;
        }
 
        Stack<T> & operator += (Stack<T> st)
        {
                if (len + st.len > size) new_size(len + st.len + 10);
                for (int i = 0; i<st.len; i++) arr[len++] = st.arr[i];
                return *this;
        }
 
        inline Stack<T> & operator += (T & x)
        {
                Push(x);
                return *this;
        }
 
        Stack<T> & operator = (Stack<T> st)
        {
                delete[] arr;
                arr = new T[size = st.size];
                len = st.len;
                for (int i = 0; i < len; i++) arr[i] = st.arr[i];
                return *this;
        }
        bool operator == (Stack<T> & st)
        {
                if (len != st.len) return false;
                for (int i = 0; i<len; i++) if (arr[i]!=st.arr[i]) return false;
                return true;
        }
 
        inline bool operator != (Stack<T> & st)
        {
                this->operator == (st);
        }
        inline Stack<T> & operator >> (T & x)    // = pop
        {
                x = Pop();
                return *this;
        }
        inline Stack<T> & operator << (T & x)    // = push
        {
                Push(x);
                return *this;
        }
};
DebieCooper
 Аватар для DebieCooper
34 / 34 / 1
Регистрация: 12.10.2011
Сообщений: 285
20.12.2011, 22:45  [ТС]     Реализация стека с помощью массива #3
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: ссылка на неразрешенный внешний символ _main в функции ___tmainCRTStartup
1>D:\Games\Мои программы\324fd\Debug\324fd.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
Питекантроп
 Аватар для Питекантроп
246 / 140 / 6
Регистрация: 14.06.2010
Сообщений: 340
21.12.2011, 03:17     Реализация стека с помощью массива #4
В чем компилируете? Вижуал студио?
Как объявляете экземпляр класса? Так Stack<int> S; ?
DebieCooper
 Аватар для DebieCooper
34 / 34 / 1
Регистрация: 12.10.2011
Сообщений: 285
21.12.2011, 12:24  [ТС]     Реализация стека с помощью массива #5
Цитата Сообщение от Питекантроп Посмотреть сообщение
В чем компилируете? Вижуал студио?
Как объявляете экземпляр класса? Так Stack<int> S; ?
2008 студия.
2 вопрос не понял. Можете полный код скинуть?
Питекантроп
 Аватар для Питекантроп
246 / 140 / 6
Регистрация: 14.06.2010
Сообщений: 340
21.12.2011, 15:50     Реализация стека с помощью массива #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот, с примером использования.

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
#include <iostream>
 
template <class T>
class Stack
{
private:
        T * arr;
        int size, len;
        void new_size(int s)
        {
                if (s<=0) return;
                T * new_arr = new T[s];
                int min_s = s<len?s:len;
                for (int i = 0; i<min_s; i++) new_arr[i] = arr[i];
                delete[] arr;
                size = s;
                arr = new_arr;
        }
 
public:
        Stack()
        {
                len = 0;
                arr = new T[size = 5];
        }
 
        Stack(Stack & st)
        {
                arr = new T[size = st.size];
                len = st.len;
                for (int i = 0; i < len; i++) arr[i] = st.arr[i];
        }
 
        ~Stack()
        {
                delete[] arr;
        }
 
        int Size()
        {
                return len;
        }
 
        void Push(T x)
        {
                if (len == size) new_size(size<<1);
                arr[len++] = x;
        }
        T Pop()
        {
                if (size > 10 && len < size>>2) new_size(size>>1);
                if (len == 0) return arr[len];
                return arr[--len];
        }
        T Top()
        {
                return arr[len];
        }
        void Clear()
        {
                delete arr;
                len = 0;
                arr = new T[size = 5];
        }
 
        bool IsEmpty()
        {
                return len == 0;
        }
 
        Stack<T> operator + (Stack<T> & st)
        {
                Stack<T> S;
                S.new_size(len + st.len + 10);
                for (int i = 0; i<len; i++) S.arr[S.len++] = arr[i];
                for (int i = 0; i<st.len; i++) S.arr[S.len++] = st.arr[i];
                return S;
        }
        Stack<T> operator + (T x)
        {
                Stack<T> S;
                S.new_size(len + 10);
                for (int i = 0; i<len; i++) S.arr[S.len++] = arr[i];
                S.arr[S.len++] = x;
                return S;
        }
 
        Stack<T> & operator += (Stack<T> & st)
        {
                if (len + st.len > size) new_size(len + st.len + 10);
                for (int i = 0; i<st.len; i++) arr[len++] = st.arr[i];
                return *this;
        }
 
        inline Stack<T> & operator += (T x)
        {
                Push(x);
                return *this;
        }
 
        Stack<T> & operator = (Stack<T> & st)
        {
                delete[] arr;
                arr = new T[size = st.size];
                len = st.len;
                for (int i = 0; i < len; i++) arr[i] = st.arr[i];
                return *this;
        }
        bool operator == (Stack<T> & st)
        {
                if (len != st.len) return false;
                for (int i = 0; i<len; i++) if (arr[i]!=st.arr[i]) return false;
                return true;
        }
 
        inline bool operator != (Stack<T> & st)
        {
                this->operator == (st);
        }
        inline Stack<T> & operator >> (T & x)    // = pop
        {
                x = Pop();
                return *this;
        }
        inline Stack<T> & operator << (T x)    // = push
        {
                Push(x);
                return *this;
        }
};
 
 
using namespace std;
int main(int argc, char* argv[])
{
    Stack<int> S;
    int x;
    S<<33;
    S>>x;
    cout<<x<<endl;
 
    S<<1<<2<<10;
    while (!S.IsEmpty()) cout<<S.Pop()<<" ";
    cout<<endl;
 
    S<<1<<2<<10;
    Stack<int> S1;
    S1.Push(78);
    S += S1 + S + 20;
    while (!S.IsEmpty()) cout<<S.Pop()<<" ";
    cout<<endl;
 
    Stack<char*> S_str;
    S_str<<"qwer"<<"asdf"<<"zxcv";
    while (!S_str.IsEmpty()) cout<<S_str.Pop()<<" ";
    cout<<endl;
 
    cin>>x;
    return 0;
}
Yandex
Объявления
21.12.2011, 15:50     Реализация стека с помощью массива
Ответ Создать тему
Опции темы

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