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

Реализация стека на массиве и динамическом распределении памяти - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.79
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
09.03.2012, 12:28     Реализация стека на массиве и динамическом распределении памяти #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
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
 
const int MS=100;
char stack[MS]={0}; 
int t=0;
 
void PUSH(char y)
    {
        if(t>MS) {cout<<"Operaciya zapisi v stek nevozmojena, stek perepolnen"<<endl; system("PAUSE"); exit(0);} 
        else{
            t=t+1;
            stack[t]=y;}
    }
 
char POP()
    {
        if(t==0) {cout<<"Operaciya chteniya iz steka nevozmojna, stek pust"<<endl; system("PAUSE"); exit(0);}
        else{
            t=t-1;
            return stack[t+1];}
    }
 
void main()
{
    FILE *fps;
    fps=fopen("text.txt", "r");
 
    char *str;
    str=new char [MS];
    int i;
    while(!feof(fps))
        {
            fgets(str, MS, fps);
            for(i=0; str[i]!='\0'&& str[i]!='\n'; i++)
            {
               cout<<str[i];
            }
            if(str[i]=='\n') cout<<endl;
        }
    delete (str);
    cout<<endl<<endl;
    rewind(fps);
    char c;
    while(!feof(fps))
        {
            c=fgetc(fps);
            if(feof(fps)){while(t!=0) cout<<POP(); cout<<"\n";}
            if(c!=' ' && c!='\n') PUSH(c);
            if(t==0 & c!='\n') POP();
            if(c=='\n'){while(t!=0) cout<<POP(); cout<<"\n";}
            if(c==' '){while(t!=0) cout<<POP(); cout<<" ";}
        }
    system("PAUSE");
    fclose(fps);
}
проблема заключается в том что если к примеру из файла такой текст
Код
Korotkov Alex group 430-2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Oleg Ivanov Group 455
то проверка о том что стек переполнен при непрерывном его использования не срабатывает, хоть и стоит что t>MS, и должен выдать сообщ что стек полный... я про функцию PUSH
в чем проблема, что не так написано в моем коде? подскажите пож-та

Добавлено через 31 минуту
разве никто не знает и ничего не может подсказать??
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.03.2012, 12:28     Реализация стека на массиве и динамическом распределении памяти
Посмотрите здесь:

C++ Вопрос о динамическом выделении памяти
Реализация стека в динамическом массиве C++
C++ что значит "поставить контроль памяти"? (в динамическом массиве)
Немного о динамическом выделении памяти ... C++
C++ Не могу найти ошибку с подсчетом суммы элементов в интервале[a,b] в динамическом одномерном массиве массиве.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
09.03.2012, 12:36     Реализация стека на массиве и динамическом распределении памяти #2
трассировку сделай и поймешь где ошибка
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
09.03.2012, 12:59  [ТС]     Реализация стека на массиве и динамическом распределении памяти #3
Цитата Сообщение от panicwassano Посмотреть сообщение
трассировку сделай и поймешь где ошибка
пошаговую проверку? делал! так и не пойму почему он обходит проверку....

Добавлено через 18 минут
все нашел ошибку в сравнении надо было t=MS-1
теперь займусь динамич реализацией
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
11.03.2012, 22:03  [ТС]     Реализация стека на массиве и динамическом распределении памяти #4
всем привет еще раз, пытаюсь сделать теперь реализацию стека с использованием динамич распред памяти и не пойму почему компилятор (VS 2010) ругается Не обработанное исключение
вот код
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
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
 
const int MS=101;
char stack[MS]={0}; 
int t=0;
 
void PUSH(char y)
    {
        if(t==MS-1) {cout<<endl<<"Operaciya zapisi v stek nevozmojena, stek perepolnen"<<endl; system("PAUSE"); exit(0);} 
        else{
            t=t+1;
            stack[t]=y;}
    }
 
char POP()
    {
        if(t==0) {cout<<"Operaciya chteniya iz steka nevozmojna, stek pust"<<endl; system("PAUSE"); exit(0);}
        else{
            t=t-1;
            return stack[t+1];}
    }
 
struct Stack
        {
            char info;
            Stack *next;
                        } *st=NULL;
 
void _PUSH(char y)
    {
        Stack *Tmp = new Stack;
        Tmp->info=y;
        Tmp->next=st;
        st=Tmp;
        delete Tmp;
    }
 
char _POP()
    {
        Stack *Tmp = new Stack;
        Tmp=st;
        st=Tmp->next;
        delete Tmp;
        if(st!=NULL) return st->info;
        else return 0;
    }
void main()
{
    FILE *fps;
    fps=fopen("text.txt", "r");
 
    char *str;
    str=new char [MS];
    int i;
    while(!feof(fps))
        {
            fgets(str, MS, fps);
            for(i=0; str[i]!='\0'&& str[i]!='\n'; i++)
            {
               cout<<str[i];
            }
            if(str[i]=='\n') cout<<endl;
        }
    delete (str);
    cout<<endl<<endl;
    rewind(fps);
//--------------------------Реализация стека на массиве-----------------------------------------
/*  char c;
    while(!feof(fps))
        {
            c=fgetc(fps);
            if(feof(fps)){while(t!=0) cout<<POP(); cout<<"\n";}
            if(c!=' ' && c!='\n') PUSH(c);
            if(t==0 & c!='\n') POP();
            if(c=='\n'){while(t!=0) cout<<POP(); cout<<"\n";}
            if(c==' '){while(t!=0) cout<<POP(); cout<<" ";}
        }*/
//--------------Реализация стека с использованием динамического распределения памяти----------
    char c;
    while(!feof(fps))
        {
            c=fgetc(fps);
            if(feof(fps)){while(st!=NULL) cout<<_POP(); cout<<"\n";}
            if(c!=' ' && c!='\n') _PUSH(c);
            if(t==0 & c!='\n') _POP();
            if(c=='\n'){while(st!=NULL) cout<<_POP(); cout<<"\n";}
            if(c==' '){while(st!=NULL) cout<<_POP(); cout<<" ";}
 
 
        }
    
    
    
    system("PAUSE");
    fclose(fps);
}
подскажите в чем ошибка....

Добавлено через 10 часов 36 минут
и разве никто ничего не знает???

Добавлено через 9 часов 16 минут
Народ, разве никто не может ничем помочь?.....
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
11.03.2012, 22:36     Реализация стека на массиве и динамическом распределении памяти #5
у вас тут все в куче понамешано и структуры и просто массив стек, сделайте нормально
и у стека есть вершина, где она у вас тут???
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
12.03.2012, 10:45  [ТС]     Реализация стека на массиве и динамическом распределении памяти #6
Цитата Сообщение от panicwassano Посмотреть сообщение
у вас тут все в куче понамешано и структуры и просто массив стек, сделайте нормально
и у стека есть вершина, где она у вас тут???
в задании вроде написано сделать реализацию в двух видах
я первую сделал и закоментировал чтоб не мешала
вторая ниже которая вот ее и делаю _POP и _PUSH функции для работы дин реализ
в смысле где указатель там же вроде есть указатель st или Tmp
а как надо??

Добавлено через 11 часов 54 минуты
и опять никто не знает..
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.03.2012, 11:19     Реализация стека на массиве и динамическом распределении памяти #7
eddilou,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Stack
                {
                        char info;
                        Stack *next;
                                                } *st=NULL;
 
void _PUSH(char y)
        {
                Stack *Tmp = new Stack;
                Tmp->info=y;
                Tmp->next=st;
                st=Tmp;
                delete Tmp;
        }
Ну адовый бред же по названиям... В стек кладем второй стек. На плюсах так писать не надо.
Да еще сделали tmp и сразу его удалили. Красота. Указатель указывает на мусор.

Добавлено через 18 минут
Пример.

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 <iostream>
#include <stdexcept>
 
template<class T>
class Stack
{
   struct Node
   {
      Node(Node* n, const T& val):next(n), value(val)
      {
      }
      Node* next;
      T value;
   };
public:
   Stack():top_(0), size_(0)
   {
   }
   ~Stack()
   {
       while (!empty())
       {
           pop();
       }
    }
   void push(const T&);
   const T top() const;
   void pop();
   const size_t size() const;
   bool empty() const;
private:
   Node* top_;
   size_t size_;
};
 
template<class T>
void Stack<T>::push(const T& value)
{
   Node* tmp = new Node(top_, value);
   top_ = tmp;
   ++size_;
}
 
template<class T>
const T Stack<T>::top() const
{
   if (top_ == 0)
   {
      throw std::logic_error("Empty stack");
   }
   return top_->value;
}
 
template<class T>
void Stack<T>::pop()
{
   if (top_ == 0)
   {
      throw std::logic_error("Empty stack");
   }
   Node* tmp = top_;
   top_ = top_->next;
   delete tmp;
   --size_;
}
 
template<class T>
bool Stack<T>::empty() const
{
   return !size_;
}
 
template<class T>
const size_t Stack<T>::size() const
{
   return size_;
}
 
int main()
{
   Stack<int> stck;
   stck.push(5);
   stck.push(10);
   stck.push(8);
   std::cout << stck.size() << std::endl;
   while (!stck.empty())
   {
      std::cout << stck.top() << std::endl;
      stck.pop();
   }
}
http://liveworkspace.org/code/f637ed...b9e2adb6d64a7c
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
12.03.2012, 19:17  [ТС]     Реализация стека на массиве и динамическом распределении памяти #8
насчет того бреда я исправил уже ранее но теперь другая проблема почему в стек попадает пробел и не срабатывает проверка st==NULL в функции _POP
допустим такой текст
adasdsf sadaassa
пробел не является текстом или словом поэтому попасть в стек не должен
это все касается ддинамич реализации почему н есрабатывает я не пойму..
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
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
using namespace std;
 
const int MS=101;
char stack[MS]={0}; 
int t=0;
 
void PUSH(char y)
    {
        if(t==MS-1) {cout<<endl<<"Operaciya zapisi v stek nevozmojena, stek perepolnen"<<endl; system("PAUSE"); exit(0);} 
        else{
            t=t+1;
            stack[t]=y;}
    }
 
char POP()
    {
        if(t==0) {cout<<"Operaciya chteniya iz steka nevozmojna, stek pust"<<endl; system("PAUSE"); exit(0);}
        else{
            t=t-1;
            return stack[t+1];}
    }
 
struct Stack
        {
            char info;
            struct Stack *next;
                        } *st=NULL;
 
void _PUSH(char y)
    {
        struct Stack *Tmp = new Stack;
        Tmp->info=y;
        Tmp->next=st;
        st=Tmp;
    }
 
char _POP()
    {
        char y;
            if(st==NULL){cout<<"Operaciya chteniya iz steka nevozmojna, stek pust"<<endl; system("PAUSE"); exit(0);}
        else {
            struct Stack *Tmp=st;
            st=Tmp->next;
            y=Tmp->info;
            delete Tmp;
            return y;}
    }
void main()
{
    FILE *fps;
    fps=fopen("text.txt", "r");
 
    char *str;
    str=new char [MS];
    int i;
    while(!feof(fps))
        {
            fgets(str, MS, fps);
            for(i=0; str[i]!='\0'&& str[i]!='\n'; i++)
            {
               cout<<str[i];
            }
            if(str[i]=='\n') cout<<endl;
        }
    delete (str);
    cout<<endl<<endl;
    rewind(fps);
//--------------------------Реализация стека на массиве-----------------------------------------
    char c;
/*  while(!feof(fps))
        {
            c=fgetc(fps);
            if(feof(fps)){while(t!=0) cout<<POP(); cout<<"\n";}
            if(c!=' ' && c!='\n') PUSH(c);
            if(t==0 & c!='\n') POP();
            if(c=='\n'){while(t!=0) cout<<POP(); cout<<"\n";}
            if(c==' '){while(t!=0) cout<<POP(); cout<<" ";}
        }*/
//--------------Реализация стека с использованием динамического распределения памяти----------;
    while(!feof(fps))
        {
            c=fgetc(fps);
            if(feof(fps)){while(st!=NULL) cout<<_POP(); cout<<"\n";}
            if(c!=' ' && c!='\n') _PUSH(c);
            if(c=='\n'){while(st!=NULL) cout<<_POP(); cout<<"\n";}
            if(c==' '){while(st!=NULL) cout<<_POP(); cout<<" ";}
        }
    system("PAUSE");
    fclose(fps);
}
вот c++ и классы я не оч понимаю

Добавлено через 1 час 20 минут
разве проверка не верна???

Добавлено через 1 час 29 минут
жаль что нет людей которые понимают что другие учатся, и если просят подсказку почему бы не подсказать...
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
12.03.2012, 19:20     Реализация стека на массиве и динамическом распределении памяти #9
жаль, что вы не можете открыть учебник и переписать код оттуда, или использовать поиск по форуму
Реализовать стек
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
12.03.2012, 19:32  [ТС]     Реализация стека на массиве и динамическом распределении памяти #10
panicwassano,
я это смотрел, но проблема в другом, не могу понять почему проверка не срабатывает если первый пробел в файле, при вывода из стека должен вывести сообщ что операция невозможна стек пуст и почему то пробел вгоняется в стек если стоит условие.. в самой функции main
на массиве все ок а на структурах пропускает почему немогу понять все перепробовал
не срабатывает проверка функции _POP
в чем дело??...
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
12.03.2012, 20:52     Реализация стека на массиве и динамическом распределении памяти #11
трассировка пошаговая, найдете на каком шаге ошибка
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2013, 03:39     Реализация стека на массиве и динамическом распределении памяти
Еще ссылки по теме:

C++ ошибка на динамическом выделении памяти
C++ Разработать программу, реализующую алгоритм стека (20 элементов). Задача решается в двух вариантах: статическом и динамическом
Создание исключения при динамическом выделении памяти C++

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

Или воспользуйтесь поиском по форуму:
_MAXimka
0 / 0 / 0
Регистрация: 23.12.2013
Сообщений: 3
23.12.2013, 03:39     Реализация стека на массиве и динамическом распределении памяти #12
Почему -

t=t-1;
return stack[t+1];


А не -
return stack[t--];

??????
Yandex
Объявления
23.12.2013, 03:39     Реализация стека на массиве и динамическом распределении памяти
Ответ Создать тему
Опции темы

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