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

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

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

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

13.11.2012, 15:05. Просмотров 800. Ответов 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++
Изменить программу предыдущей лабораторной работы. Функцию, определяющую бьет ли первая карта вторую, определить в базовом классе как...

с++ перегрузки - C++
Нужна помощь с реализацией кода(перегрузка добавления элемента в массив) Полная постановка задачи. АТД - множество с элементами типа...

Перегрузки (operator+) - C++
Прошу помощи не могу понять как сделать реализацию для этого куска Также добавьте operator+ для сложения объекта String с...

Функции перегрузки - C++
Здравствуйте, помогите решить задачу. Зараниее спасибо. С помощью механизма перегрузки функций реализовать функции для нахождения...

Механизм перегрузки - C++
Здравствуйте, помогите решить задачу. С помощью механизма перегрузки функций организовать сложение: а) числа с самим собой (один...

Перегрузки функции - C++
вот задание: Задание 1: Разработка класса. Разработайте класс FRACTION. Элемент класса: ? числитель; ? знаменатель. ...

Механизм перегрузки - C++
Ребят помогите. Нужно создать две версии функции, используя механимз перегрузки, заголовки у которых должны быть такими: №1 float F(float...

Перегрузки массивов - C++
Даны массивы следующих типов данных: Long = {},double ={},float = {}, int ={},short ={},long long ={}.


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3116 / 1918 / 208
Регистрация: 13.01.2012
Сообщений: 7,332
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     Стек, перегрузки, псевдопеременные
Ответ Создать тему
Опции темы

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