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

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

Войти
Регистрация
Восстановить пароль
 
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
#1

Стек, не во всех случаях работает удаление - C++

16.12.2010, 23:56. Просмотров 657. Ответов 3
Метки нет (Все метки)

Описать класс Lifo, реализовать стек произвольного размера для хранения целых чисел, добавление и извлечение одиночного элемента из стека, реализовать при помощи перегрузки операций >, <. Добавлять последовательность элементов, перегрузив оператор >>. Вывод на экран - <<.

Проблема в реализации, иногда удаление норм работает, а иногда при удаление прога вылетает
Пример когда вылетает
Это реализация
сейчас в стеке один элемент, равный 0
Выберете операцию:
1-загрузить в стек один элемент;
2-загрузить в стек несколько элементов;
3-вывести последний загруженный эл-т и удалить его;
4-вывести весь стек
1
введите элемент
2


Выберете операцию:
1-загрузить в стек один элемент;
2-загрузить в стек несколько элементов;
3-вывести последний загруженный эл-т и удалить его;
4-вывести весь стек
2
сколько еще элементов будет загружено в стек?
4
Введите1элемент
4
Введите2элемент
5
Введите3элемент
6
Введите4элемент
7


Выберете операцию:
1-загрузить в стек один элемент;
2-загрузить в стек несколько элементов;
3-вывести последний загруженный эл-т и удалить его;
4-вывести весь стек
4
Весь стек:
7 6 5 4 2 0

Выберете операцию:
1-загрузить в стек один элемент;
2-загрузить в стек несколько элементов;
3-вывести последний загруженный эл-т и удалить его;
4-вывести весь стек
3


вводим 3 и прога вылетает, почему так и как это исправить?

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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std; 
class Lifo
{
 private:
    struct element
    { 
     int value; // ячейка для хранения инфоормации
     element *next; // указатель на следующий элемент стека
    };
  element *last; // указатель на последний элемент стека
 public:
Lifo(void) //  Конструктор без параметра
    {
     last=new element;
     last->value=0;
     last->next=NULL; 
    }; 
Lifo (int x) // Конструктор с параметром
    {
     last=new element;
     last->value=x;
     last->next=NULL;
    };
void operator>(int val) // операция >
    {
     element *pv=new element;
     pv->value=val;
     pv->next=last;
     last=pv; 
    };
void operator>>(int n) // добавление эл-тов в стек 
    {
     int val; 
     for(int i=0;i<n;i++)
        {
     cout<<"Введите"<<i+1<<"элемент"<<endl;
     cin>>val;
     element *pv=new element;
     pv->value=val; 
     pv->next=last;
     last=pv;
        };
    };
void operator< (int a) //операция <
    {
     cout<< "Последне введенное число: "  << last->value <<endl; 
     element *pv=last;
     last=last->next; 
     delete pv; 
    };
void operator<<(int a)//вывод на экран
    {
     cout<<"Весь стек:"<<endl; 
     while(last!=NULL)
        {
         cout<<last->value<<" " ;
         element *pv=last;
         last=last->next; 
         delete pv; 
        };
    }; 
};
 
int  _tmain()
{
    setlocale(LC_ALL,"Russian") ;
 Lifo A(0);
 char znak;
 cout<<"сейчас в стеке один элемент, равный 0"<<endl;
for(int i=0;i<5;i++)
 {
    cout<<"Выберете операцию:\n1-загрузить в стек один элемент;\n2-загрузить в стек несколько элементов;\n3-вывести последний загруженный эл-т и удалить его;\n4-вывести весь стек"<<endl;
    cin>>znak;
    int n;
     switch (znak)
      { 
        case '1':
                 int q;
                 cout<<"введите элемент"<<endl;
                 cin>>q;
                 A. operator>(q);
                 break; 
        case '2':
                 cout<<"сколько еще элементов будет загружено в стек?"<<endl;
                 cin>>n;
                 A. operator >>(n);
                 break; 
        case '3':
                 A.operator <(0);
                 break; 
        case '4':
                 A.operator <<(0);
                 break;
      }
    cout<<"\n"<<endl; 
} 
_getch();
return 0; 
}
Добавлено через 2 часа 19 минут
никто не знает
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2010, 23:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стек, не во всех случаях работает удаление (C++):

Удаление всех четных элементов из массива (программа не работает) - C++
Доброго времени суток, не работает такая вот конструкция для &quot;удаления&quot; нечетных элементов из массива, почему? В паскале помнится такое...

Rand: Во всех случаях генерируются одинаковые значения - C++
Всем привет. Имею след. код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;ctime&gt; class C { ...

Почему в одних случаях пишут void main(), а в других случаях int main() {return 1;} - C++
Препод мне доказывает, что void в main`е писать неправильно, а объяснить не может почему. Кто расскажет?)

Стек(удаление элементов) - C++
Привет, форумчане ! помогите пожалуйста в таком вот задании: **ввести с клавиатуры 10 элементов и сформировать с них стек. удалить со...

Организовать заданную структуру данных: точка (x, y) плоскости, стек (добавление, удаление и чтение элемента) - C++
Организовать заданную структуру данных: точка (x, y) плоскости, стек. Определить структуру элемента и написать подпрограммы добавления,...

Сформировать стек всех слов, длина которых меньше либо равна 5 - C++
Помогите с программой на c++. Дан текст, состоящий не менее чем из 7 слов. Сформировать стек всех слов, длина которых меньше либо равна 5.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
17.12.2010, 00:20 #2
White Luna, лёгкий приступ дежавю...
0
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
17.12.2010, 00:41  [ТС] #3
угу, ток в этом случае удаление должно быть реализовано, через оператор <.

C++
1
  cout<< "Последне введенное число: "  << last->value <<endl;
и вот на это строчку ругается
0
easybudda
Модератор
Эксперт CЭксперт С++
9632 / 5580 / 948
Регистрация: 25.07.2009
Сообщений: 10,714
17.12.2010, 01:38 #4
Цитата Сообщение от White Luna Посмотреть сообщение
удаление должно быть реализовано, через оператор <
Не комильфо как-то...
Вот тот же самый класс, один метод добавил, ну и пару функций написал, даже не дружественных...
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
#include <iostream>
#include <string>
 
template <typename T>
class Stack {
        T * arr;
        int size;
        int pos;
public:
        Stack(int s) : size(s), pos(-1) {
                arr = new T [ size ];
        }
        ~Stack() {
                if ( arr )
                        delete [] arr;
        }
        
        void push(const T & val){
                if ( pos >= size - 1 )
                        throw ( std::string("Stack is full!") );
                arr[++pos] = val;
        }
        
        T pop(){
                if ( pos < 0 )
                        throw ( std::string("Stack is empty!") );
                return arr[pos--];
        }
        
        bool empty() const {
            return pos < 0;
        }
};
 
template <typename T>
std::istream & operator >> ( std::istream & ist, Stack<T> & stk ){
    T val;
    ist >> val;
    try {
        stk.push(val);
    }
    catch ( std::string e ){
        std::cerr << e << std::endl;
    }
    return ist;
}
 
template <typename T>
std::ostream & operator << ( std::ostream & ost, Stack<T> & stk ){
    T val;
    try {
        val = stk.pop();
        ost << val;
    }
    catch ( std::string e ){
        std::cerr << e << std::endl;
    }
    return ost;
}
 
int menu(){
    std::cout << std::endl;
    std::cout << "1 - put one\n2 - put some\n3 - get one\n4 - get all\n0 - exit\n> ";
    int ret;
    std::cin >> ret;
    std::cout << std::endl;
    return ret;
}
 
int main(){
    const int SIZE(10);
    Stack<int> stk(SIZE);
    int m;
    
    while ( m = menu() ){
        switch ( m ){
            case 1 :
                std::cout << "> ";
                std::cin >> stk;
                break;
            case 2 :
                {
                    int cnt;
                    std::cout << "Number of elements for input: ";
                    std::cin >> cnt;
                    if ( cnt < 1 ){
                        std::cerr << "Wrong input!" << std::endl;
                        break;
                    }
                    while (  cnt-- ){
                        std::cout << "> ";
                        std::cin >> stk;
                    }
                }
                break;
            case 3 :
                std::cout << stk << std::endl;
                break;
            case 4 :
                while ( ! stk.empty() )
                    std::cout << stk << std::endl;
                break;
            default :
                std::cerr << "Wrong choice!" << std::endl;
                break;
        }
    }
    
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2010, 01:38
Привет! Вот еще темы с ответами:

Создать стек и очередь, вычислив среднее арифметическое значение всех элементов - C++
На основе данных входного файла создать стек и очередь, вычислив среднее арифметическое значение всех элементов. Удалить из списка...

Не работает программа (структура и стек) - C++
Вот код: #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;stack&gt; using namespace std; struct sport {

Не во всех случаях работает передача объекта в метод по ссылке - C#
Всем нам известно, что классы - это ссылочный тип данных и передавая экземпляр класса в метод, он передается по ссылке. Если метод внесет...

Некорректная работа функции sleep. (не во всех случаях работает) - PascalABC.NET
В этом случае все порядке,программа работает правильно,задержку заметно. Procedure form1.UPAnim1; Begin Var a:integer :=210; For...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.12.2010, 01:38
Ответ Создать тему
Опции темы

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