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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
#1

CТЕК ! - C++

26.07.2011, 14:48. Просмотров 1807. Ответов 17
Метки нет (Все метки)

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
#include <iostream>
 
using namespace std;
 
class stack {
    int st[100];
    int tos;
    public:
        int back();
        void init();
        void push(int i);
        int pop();
        int size();
        void clear();
};
 
void stack::init()
{
    tos = 0;
}
void stack::push(int i)
{
    if (tos == 100)
    {
        cout <<"Stack is full\n";
        return;
    }
    st[tos] = i;
    tos++;
    cout << "ok";
}
 
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";
 
    }
    tos--;
    return st[tos];
    st[tos] = 0;
}
 
void stack::clear()
{
    for(int i = 0; i <= tos; i++)
        st[i] = 0;
        cout <<"ok";
        tos = 0;
}
 
int stack::back()
{
    return st[tos-1];
}
int stack::size()
{
    return tos;
}
 
int main()
{
    stack stack1;
    int n;
    stack1.init();
    string str;
        while(true)
        {
            cin >> str;
            if (str == "push")
            {
                cin >> n;
                stack1.push(n);
                cout << endl;
            }
            if (str =="pop")
              {
                    cout << stack1.pop();
              }
 
            if (str == "exit")
             {
                    cout << "bye" ;
                    return 0;
             }
            if (str == "clear")
             {
                 stack1.clear();
                 cout << endl;
             }
            if (str == "size")
             {
                 cout << stack1.size();
                 cout << endl;
             }
            if (str =="back")
            {
                cout << stack1.back();
                cout << endl;
            }
        }
 
    return 0;
}
Pop чет нито работает ! return 0 мне нужно выйти а он возвращает 0

Добавлено через 6 минут
проверьте плиз функцию int stack:: pop() , когда я добавляю return 0 , у меня выводит значение return -а

Добавлено через 30 минут
вот условие задачи
Реализуйте структуру данных "стек". Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push n
Добавить в стек число n (значение n задается после команды). Программа должна вывести ok.
pop
Удалить из стека последний элемент. Программа должна вывести его значение.
back
Программа должна вывести значение последнего элемента, не удаляя его из стека.
size
Программа должна вывести количество элементов в стеке.
clear
Программа должна очистить стек и вывести ok.
exit
Программа должна вывести bye и завершить работу.

Перед исполнением операций back и pop программа должна проверять, содержится ли в стеке хотя бы один элемент. Если во входных данных встречается операция back или pop, и при этом стек пуст, то программа должна вместо числового значения вывести строку error.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2011, 14:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос CТЕК ! (C++):

Cтек!!! - C++
Нужно реализовать стек. Обучающий. Но без использования классов точнее говоря без ООП. Должен в себя включать создать, добавить,...

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

Cтек (удалить элемент, который мы хотим) - C++
нужно из стека удалить элемент ,который мы хотим. нашла вот это: void del_elem() { int t; cout &lt;&lt; &quot;vvedite chislo dlya udaleniya&quot;...

Cтек в Delphi! - Delphi
ребят помогите сделать задачу, не понимаю как делать. Ввести символы, формируя из них стек.Найти минимальный элемент и вставить после него...

Cтек и очередь в односвязных списках - VBA
Разработать программу для выполнения следующих операций: 1 Ввод значения с клавиатуры в переменную 2 Добавление значения из переменной...

Cтек!!! - C++
Нужно реализовать стек. Обучающий. Но без использования классов точнее говоря без ООП. Должен в себя включать создать, добавить,...

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

Cтек (удалить элемент, который мы хотим) - C++
нужно из стека удалить элемент ,который мы хотим. нашла вот это: void del_elem() { int t; cout &lt;&lt; &quot;vvedite chislo dlya udaleniya&quot;...

Cтек в Delphi! - Delphi
ребят помогите сделать задачу, не понимаю как делать. Ввести символы, формируя из них стек.Найти минимальный элемент и вставить после него...

Cтек и очередь в односвязных списках - VBA
Разработать программу для выполнения следующих операций: 1 Ввод значения с клавиатуры в переменную 2 Добавление значения из переменной...

Cтек!!! - C++
Нужно реализовать стек. Обучающий. Но без использования классов точнее говоря без ООП. Должен в себя включать создать, добавить,...

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

Cтек (удалить элемент, который мы хотим) - C++
нужно из стека удалить элемент ,который мы хотим. нашла вот это: void del_elem() { int t; cout &lt;&lt; &quot;vvedite chislo dlya udaleniya&quot;...

Cтек в Delphi! - Delphi
ребят помогите сделать задачу, не понимаю как делать. Ввести символы, формируя из них стек.Найти минимальный элемент и вставить после него...

Cтек и очередь в односвязных списках - VBA
Разработать программу для выполнения следующих операций: 1 Ввод значения с клавиатуры в переменную 2 Добавление значения из переменной...

Cтек!!! - C++
Нужно реализовать стек. Обучающий. Но без использования классов точнее говоря без ООП. Должен в себя включать создать, добавить,...

Cтек!!! - C++
Нужно реализовать стек. Обучающий. Но без использования классов точнее говоря без ООП. Должен в себя включать создать, добавить,...

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

Cтек (удалить элемент, который мы хотим) - C++
нужно из стека удалить элемент ,который мы хотим. нашла вот это: void del_elem() { int t; cout &lt;&lt; &quot;vvedite chislo dlya udaleniya&quot;...

Cтек в Delphi! - Delphi
ребят помогите сделать задачу, не понимаю как делать. Ввести символы, формируя из них стек.Найти минимальный элемент и вставить после него...

Cтек и очередь в односвязных списках - VBA
Разработать программу для выполнения следующих операций: 1 Ввод значения с клавиатуры в переменную 2 Добавление значения из переменной...


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

Или воспользуйтесь поиском по форуму:
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
26.07.2011, 14:51 #2
C++
1
2
3
4
5
6
7
8
9
10
11
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";return 0;
 
    }
    tos--;
    return st[tos];
  
}
По-моему в pop последняя строка лишняя. Ну, я уже убрал её)
0
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
26.07.2011, 14:53  [ТС] #3
а удалять же надо
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
26.07.2011, 14:54 #4
Первое, что сразу заметил, это строка после return.
C++
1
2
3
4
5
6
7
8
9
10
11
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";
 
    }
    tos--;
    return st[tos];
    st[tos] = 0;//эта строка никогда не выполнится
}
есть даже какой-то специальный англоязычный термин для этой ситуации, я его не помню, но по-русски он звучит примерно как "мертвый код".

Второе: если tos==0, то ты все равно его декримируешь и пытаешься вернуть st[-1], что естественно ведет к ошибке. Вот так будет правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";
        return 0;
 
    }
    else{
        tos--;
        return st[tos];
    }
}
обнулять освобожденный элемент необязательно, если стек организован правильно, то ни к чему плохому это не превидет, можно не беспокоиться.
0
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
26.07.2011, 14:56 #5
Да, вот только заметил, что, когда tos равен 0 выхода из ф-ции нет.
0
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
26.07.2011, 14:57  [ТС] #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
Первое, что сразу заметил, это строка после return.
C++
1
2
3
4
5
6
7
8
9
10
11
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";
 
    }
    tos--;
    return st[tos];
    st[tos] = 0;//эта строка никогда не выполнится
}
есть даже какой-то специальный англоязычный термин для этой ситуации, я его не помню, но по-русски он звучит примерно как "мертвый код".

Второе: если tos==0, то ты все равно его декримируешь и пытаешься вернуть st[-1], что естественно ведет к ошибке. Вот так будет правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int stack::pop()
{
    if(tos == 0)
    {
        cout <<"error\n";
        return 0;
 
    }
    else{
        tos--;
        return st[tos];
    }
}
обнулять освобожденный элемент необязательно, если стек организован правильно, то ни к чему плохому это не превидет, можно не беспокоиться.
все равно не получается
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
26.07.2011, 15:03 #7
Еще для справки:
в стеке из STL есть 2 функции pop() (удаляет верхний элемент стека) и top() (возвращает, но не удаляет, верхний элемент стека).
Реализованно так, потому что:
1) Каждая функция должна выполнять одно действие, а удаление элемента и возвращение элемента - это 2 разный действия.
2)Допустим pop() была бы реализованна так, что она удаляет и возвращает верхний элемент, теперь допустим, что в процессе удаления элемента (там стек - это не массив) возникло исключение, которое прекратило работу текущего кода. Таким образом имеем - индекс декремирован, а элемент не возвращен - т.е. верхний элемент теряется навсегда.
Вот, где-то так) Поэтому в стеке из STL мы имеем 2 функции, а не одну.
1
Sick2
14 / 14 / 1
Регистрация: 26.11.2010
Сообщений: 235
26.07.2011, 15:03 #8
У меня всё работает, только я вместо ф-ции
C++
1
2
3
4
void stack::init()
{
    tos = 0;
}
сделал конструктор:
C++
1
stack(){tos=0;};
upd. хотя и так, и так работает)
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
26.07.2011, 15:05 #9
murod, а что не получается, сделай скриншот.
0
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
26.07.2011, 15:47  [ТС] #10
Реализуйте структуру данных "стек". Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push n
Добавить в стек число n (значение n задается после команды). Программа должна вывести ok.
pop
Удалить из стека последний элемент. Программа должна вывести его значение.
back
Программа должна вывести значение последнего элемента, не удаляя его из стека.
size
Программа должна вывести количество элементов в стеке.
clear
Программа должна очистить стек и вывести ok.
exit
Программа должна вывести bye и завершить работу.

Перед исполнением операций back и pop программа должна проверять, содержится ли в стеке хотя бы один элемент. Если во входных данных встречается операция back или pop, и при этом стек пуст, то программа должна вместо числового значения вывести строку error.
Ввод с клавиатуры !

Вот условие задачи посмотрите сами , а то свою ошибку не понял вы свой вариант сделайте !
0
LosAngeles
Заблокирован
26.07.2011, 16:09 #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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <deque>
#include <string>
#include <stdexcept>
 
 
template <typename T, typename C = std::deque<T> >
        class stack
{   
    C c;
public:
    void    pop();
    void    push(T const&);
    T       top() const;
    size_t  size() const;
    void    clear();
 
};
 
 
 
template <typename T, typename C>
        inline void stack<T, C>::push(T const& rhs)
{
    c.push_back(rhs);
}
 
 
 
template <typename T, typename C>
        inline void stack<T, C>::pop()
{
    if (!c.size()) throw (std::underflow_error("}I{0na"));
    c.pop_back();
}
 
 
 
template <typename T, typename C>
        inline T stack<T, C>::top() const
{
    return c.back();
}
 
 
template <typename T, typename C>
        inline size_t stack<T, C>::size() const
{
    return c.size();
}
 
 
template <typename T, typename C>
        inline void stack<T, C>::clear()
{
    c.clear();
}
 
 
 
int main() {
    using namespace std;
 
 
    stack<string> stk;
    stk.clear();
    stk.push("lkhjkh");
    stk.push("oiouio");
    stk.pop();
    stk.size();
    stk.top();
    stk.clear();
 
 return 0;
}
0
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
26.07.2011, 17:18  [ТС] #12
LosAngeles, а у тя точно ввод с клавиатуры
0
LosAngeles
Заблокирован
26.07.2011, 17:22 #13
Я только стек написал, программу можешь сам написать. Меню сделаешь, ввод-вывод, что душа пожелает
0
murod
-2 / 7 / 2
Регистрация: 04.11.2010
Сообщений: 163
26.07.2011, 17:37  [ТС] #14
LosAngeles, )извини но никак не получается я
добавил директиву <iostream> не получается ввести с клавиатуры с помощью Cin >> , а других функций я пока не знаю
0
LosAngeles
Заблокирован
26.07.2011, 17:48 #15
код в студию
0
Yandex
Объявления
26.07.2011, 17:48
Ответ Создать тему
Опции темы

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