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

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

Войти
Регистрация
Восстановить пароль
 
Eugenelife
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 9
#1

Стек, перегрузки, псевдопеременные - C++

13.11.2012, 15:05. Просмотров 790. Ответов 3
Метки нет (Все метки)

Нужно сделать перегрузки операторов в классе стек, я совершенно запутался и получился полнейший бред. Оно работало глюченно когда я задавал размер стека, но я переделал конструктор и перестало работать вобще. Еще в задании есть такая строчка: Использование псевдопеременных для стека должно быть выполнено таким образом, во-первых і-му элементу в стеке может быть присвоенно некоторое значение, во-вторых например при s(i,j)=s2; //где s, s2 – стеки, в стеке s начиная с i-го символа j-го элемента заменить стек на s2. Как добраться до этого j-го элемента? нужно уберать все что перед ним?
Вот что у меня есть на данный момент
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
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
 
class Stack
{
private:
    int size;
    int tos;
    char* a;
public:
    
    Stack() {tos=0; size=0; a=new char[size]; }
    Stack(const Stack &);
    ~Stack() { delete [] a; }
    void push(char s);
    char pop();
    friend ostream& operator<<(ostream &, Stack &);
    friend istream& operator>>(istream &s, Stack &);
    //void calcuc();
};
 
Stack::Stack(const Stack &x):size(x.size),a(new char[size]) {a=x.a;};
 
void Stack::push(char s)
{ 
    a[tos]=s;
    tos++;
}
char Stack::pop()
{   tos--;
    return a[tos];
}
ostream &operator<<(ostream &s, Stack &p)
{
 
    for (int i=0;i< (p.size);i++) s<<p.pop()<<"\n";
    return s;
}
istream &operator>>(istream &s, Stack &p)
{ char k;
s>>k;
for (int i=0; i<(p.size-1); i++) {while (k!='=') {s >> k; p.push(k);}
}
return s;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
Stack s1;
cin>>s1;
cout<<s1;
 
getch();
 
    return 0;
}
Помогите пожалуйста)

Добавлено через 1 час 16 минут
Переделал конструктор и сделал постфиксное считывание операций, не работает.
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
// LABA2.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
 
class Stack
{
private:
    
    char* a;
public:
    int size;
    int tos;
    Stack() {tos=0; size=0; a=new char[size]; }
    Stack(const int s);
    ~Stack() { delete [] a; }
    void push(char s);
    char pop();
    friend ostream& operator<<(ostream &, Stack &);
    friend istream& operator>>(istream &s, Stack &);
    //void calcuc();
};
 
Stack::Stack(const int s){tos=0; size=s; a=new char[size];}
 
void Stack::push(char s)
{ 
    a[tos]=s;
    tos++;
}
char Stack::pop()
{   tos--;
    return a[tos];
}
ostream &operator<<(ostream &s, Stack &p)
{
 
    for (int i=0;i< (p.size);i++) s<<p.pop()<<"\n";
    return s;
}
istream &operator>>(istream &s, Stack &p)
{ char k,a,b;
for (int i=0; i<(p.size-1); i++) {s >> k;
switch(k){
case '+':
                a = p.pop();
                b = p.pop();
                printf("%d\n", a+b);
                p.push(a+b);
                p.tos--;
                break;
case '-':
                a = p.pop();
                b = p.pop();
                p.push(b-a);
                p.tos--;
                break;
case '*':
                a = p.pop();
                b = p.pop();
                p.push(b*a);
                p.tos--;
                break;
case '/':
                a = p.pop();
                b = p.pop();
                if(a==0) {
                    printf("Деление на 0.\n"); 
                    break;
                }
                p.push(b/a);
                p.tos--;
                break;
default:
                
                p.push(k);}
 
}while (k!='=');
return s;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
Stack s1(10);
cin>>s1;
cout<<s1;
 
getch();
 
    return 0;
}
Добавлено через 14 часов 20 минут
Еще подкорректировал
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
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
 
class Stack
{
private:
    
    char* a;
public:
    int size;
    int tos;
    Stack() {tos=0; size=0; a=new char[size]; }
    Stack(const int s);
    ~Stack() { delete [] a; }
    void push(char s);
    char pop();
    friend ostream& operator<<(ostream &, Stack &);
    friend istream& operator>>(istream &s, Stack &);
};
 
Stack::Stack(const int s){tos=0; size=s; a=new char[size];
for (int i = 0; i < size; i++) {a[i]=0;} }
 
void Stack::push(char s)
{ 
    a[tos]=s;
    tos++;
    
}
char Stack::pop()
{   tos--;
    return a[tos];
}
ostream &operator<<(ostream &s, Stack &p)
{
 
    for (int i=0;i< (p.size);i++) s<<p.pop()<<"\n";
    return s;
}
istream &operator>>(istream &s, Stack &p)
{ char k;
int a,b;
for (int i=0; i<(p.size); i++) {s >> k;
switch(k){
case '+':
                a = p.pop();
                b = p.pop();
                p.push(a+b);
                break;
case '-':
                a = p.pop();
                b = p.pop();
                p.push(b-a);
        
                break;
case '*':
                a = p.pop();
                b = p.pop();
                p.push(b*a);
            
                break;
case '/':
                a = p.pop();
                b = p.pop();
                if(a==0) {
                    printf("Деление на 0.\n"); 
                    break;
                }
                p.push(b/a);
                
                break;
default:
                
    p.push(k);
    break;}
}//while (k!='=');
return s;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
Stack s1(5);
cin>>s1;
cout<<s1;
 
getch();
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2012, 15:05     Стек, перегрузки, псевдопеременные
Посмотрите здесь:

C++ Механизм перегрузки
C++ при работе рекурсивной функции заканчивается стек и программа соответственно; как сделать так, чтобы она писала "стек закончился"?
C++ Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами
C++ Перегрузки функции
Массивы и перегрузки C++
Перегрузки C++
C++ с++ перегрузки
C++ Перегрузки
Функции перегрузки C++
C++ Перегрузки
Переменные в стеке. Где хранятся? Как обрабатываются? Есть ли программный стек или только стек процессора? C++
C++ Перегрузки массивов

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,912
13.11.2012, 16:00     Стек, перегрузки, псевдопеременные #2
оператор >> как-то чудно перегружен - вы определитесь: или вы хотите считывать из потока элементы стека или хотите считывать из потока математические операции над двумя последними элементами стека с извлечением этих элементов и размещением в стеке результата операции... если второе - то не ясно чего вы ожидаете от строчки
C++
1
cin>>s1;
ведь элементов стека еще нет - там все нули.
кроме того у вас оператор << фактически приводит к очистке стека - я не знаю точно надо ли вам это, может имелось ввиду просто вывести без вытеснения всех элементов.
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
13.11.2012, 17:22     Стек, перегрузки, псевдопеременные #3
Цитата Сообщение от Eugenelife Посмотреть сообщение
int size;
Цитата Сообщение от Eugenelife Посмотреть сообщение
a=new char[size]
ни ок так делать

Добавлено через 26 секунд
при инициализации определенно будет ошибка даже если компилятор схавает
Eugenelife
0 / 0 / 0
Регистрация: 12.11.2012
Сообщений: 9
13.11.2012, 20:06  [ТС]     Стек, перегрузки, псевдопеременные #4
В общем вроде бы получилось.
Работает. Не могли бы вы мне помочь с псевдопеременными этими?
Yandex
Объявления
13.11.2012, 20:06     Стек, перегрузки, псевдопеременные
Ответ Создать тему
Опции темы

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