Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194

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

09.03.2012, 12:28. Показов 6165. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет, дано такое задание:
Используя стек, решить следующую задачу.
Напечатать каждое слово текстового файла Т в обратном порядке. Стек реализовать в двух вариантах: на массиве и с использованием динамического распределения памяти.

я пока пытаюсь сделать на массиве
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);
}
проблема заключается в том что если к примеру из файла такой текст
Code
1
2
Korotkov Alex group 430-2aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Oleg Ivanov Group 455
то проверка о том что стек переполнен при непрерывном его использования не срабатывает, хоть и стоит что t>MS, и должен выдать сообщ что стек полный... я про функцию PUSH
в чем проблема, что не так написано в моем коде? подскажите пож-та

Добавлено через 31 минуту
разве никто не знает и ничего не может подсказать??
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.03.2012, 12:28
Ответы с готовыми решениями:

Реализация стека в динамическом массиве
Условие такое: Помогите для начала хотя бы разобраться, как реализуется стек в динамическом массиве, а то чет совсем не могу въехать с...

Стоит ли при динамическом распределении памяти перехватывать возможные ошибки через try/catch?
Здравствуйте. Обращаюсь к опытным. Скажите, стоит ли при каждом динамическом распределении памяти перехватывать возможные ошибки...

Выделение памяти в динамическом массиве
Я испытываю проблемы с выделением памяти в динамическом массиве, ниже привожу кусок проблемного кода: void generate_weights() { ...

11
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
09.03.2012, 12:36
трассировку сделай и поймешь где ошибка
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
09.03.2012, 12:59  [ТС]
Цитата Сообщение от panicwassano Посмотреть сообщение
трассировку сделай и поймешь где ошибка
пошаговую проверку? делал! так и не пойму почему он обходит проверку....

Добавлено через 18 минут
все нашел ошибку в сравнении надо было t=MS-1
теперь займусь динамич реализацией
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
11.03.2012, 22:03  [ТС]
всем привет еще раз, пытаюсь сделать теперь реализацию стека с использованием динамич распред памяти и не пойму почему компилятор (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 минут
Народ, разве никто не может ничем помочь?.....
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
11.03.2012, 22:36
у вас тут все в куче понамешано и структуры и просто массив стек, сделайте нормально
и у стека есть вершина, где она у вас тут???
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
12.03.2012, 10:45  [ТС]
Цитата Сообщение от panicwassano Посмотреть сообщение
у вас тут все в куче понамешано и структуры и просто массив стек, сделайте нормально
и у стека есть вершина, где она у вас тут???
в задании вроде написано сделать реализацию в двух видах
я первую сделал и закоментировал чтоб не мешала
вторая ниже которая вот ее и делаю _POP и _PUSH функции для работы дин реализ
в смысле где указатель там же вроде есть указатель st или Tmp
а как надо??

Добавлено через 11 часов 54 минуты
и опять никто не знает..
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.03.2012, 11:19
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/... adb6d64a7c
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
12.03.2012, 19:17  [ТС]
насчет того бреда я исправил уже ранее но теперь другая проблема почему в стек попадает пробел и не срабатывает проверка 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 минут
жаль что нет людей которые понимают что другие учатся, и если просят подсказку почему бы не подсказать...
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
12.03.2012, 19:20
жаль, что вы не можете открыть учебник и переписать код оттуда, или использовать поиск по форуму
Реализовать стек
0
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
12.03.2012, 19:32  [ТС]
panicwassano,
я это смотрел, но проблема в другом, не могу понять почему проверка не срабатывает если первый пробел в файле, при вывода из стека должен вывести сообщ что операция невозможна стек пуст и почему то пробел вгоняется в стек если стоит условие.. в самой функции main
на массиве все ок а на структурах пропускает почему немогу понять все перепробовал
не срабатывает проверка функции _POP
в чем дело??...
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
12.03.2012, 20:52
трассировка пошаговая, найдете на каком шаге ошибка
0
0 / 0 / 0
Регистрация: 23.12.2013
Сообщений: 3
23.12.2013, 03:39
Почему -

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


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

??????
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.12.2013, 03:39
Помогаю со студенческими работами здесь

Освобождение памяти в динамическом двумерном массиве
Здравствуйте, скажите пожалуйста как освобождать память в динамическом двумерном массиве ? В одномерном я смог это сделать (делал через...

Ошибка при очистке памяти в динамическом массиве
вот имеется такой код. программа, которая вставляет массив в массив. всё работает правильно, но в конце выскакивает ошибка. при этом если...

Реализация стека строк в разделяемой памяти (MPI)
Написать реализацию стека строк в разделяемой памяти. При запуске программа создает блок разделяемой памяти (если его еще нет) или...

что значит "поставить контроль памяти"? (в динамическом массиве)
подскажите, пожалуйста. программа работает, но не совсем понял чего требует.

Реализация стека целых чисел. Процедура добавления нового элемента, удаление, вывод стека
Попросили написать программку, но, паскаль очень давно не практикую, поэтому прошу тут: Надо написать программу реализации стека целых...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru