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

Стек - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
24.10.2010, 16:04     Стек #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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "locale.h"
using namespace std;
 
int top;
    const int N=10;
int STACK_EMPTY1(int S[N])       // функция  проверяет стек на переполнение
{
    if (top=(N-1)) 
                return true;
    else return false;
};
 
void PUSH (int S[N],int  x)        //  функция заносит х в стек
{
    if (STACK_EMPTY1(S)) 
printf("error underflow");
    else top=top+1;
         S[top]=x;
};
 
int STACK_EMPTY(int S[N])   //функция проверяет пуст ли стек
{
if (top=0) 
          return true;
else return false;
};
 
char POP(int S[N])          // извлечение из стека 
{
if (STACK_EMPTY(S))
             printf("error underflow");
else top=top-1;
int f=S[top+1];
     return f;
};
 
int _tmain()
{
setlocale (LC_ALL, "Russian");
    int S[N];
    int y;
        int u=1;
        do 
        {
 
printf("Произведите выбор ваших дальнейших действий 0-добавить в стек 1-извлечь из стека\n");
char w;
scanf ("%s", &w);
switch (w)
{
case '0':
    printf("Вы выбрали действие - добавить в стек, теперь введите число, которое хотите добавить \n");
    scanf ("%d", &y);
    PUSH(S, y);
                        break;
case '1':
 
    printf("Вы выбрали действие - извлечь из стека, теперь введите число, которое хотите извлечь \n");
    scanf ("%d", &y);
    POP(S);
                        break;
};
printf ("Хотите повторить запрос нажмите 1, выйти нажмите 0 \n");
        scanf_s ("%d", &u);
        }
        while (u==1);
 
     system("pause");
     exit(0);
     _getch;
    return 0;
}
Добавлено через 8 минут
смысл проги как мне пояснили должен быть такой,т е она должна делать:
запрашивать что сделать добавить или извлечь из стека, постом перейти по тому что задал пользователь,
есле добавить то вывести введите число, если извлечь, то вывод числа
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2010, 16:04     Стек
Посмотрите здесь:

Стек C++
C++ Стек
C++ Стек
C++ стек
C++ Стек!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
24.10.2010, 16:15     Стек #2
В условиях должно быть сравнение а не присваивание:
C++
1
2
if (top==(N-1)) 
if (top==0)
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
24.10.2010, 16:19     Стек #3
C++
1
2
3
4
5
6
7
8
char POP(int S[N])                  // извлечение из стека 
{
if (STACK_EMPTY(S))
printf("error underflow");
else top=top-1;
int f=S[top+1];
     return f;
};
f - int, а возвращает char
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
24.10.2010, 16:20  [ТС]     Стек #4
угу, учла, но все равно терь он вообще не реагирует на то что должен добавить в стек или извлечь

Добавлено через 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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "stdafx.h"
#include "iostream"
#include "conio.h"
#include "locale.h"
using namespace std;
 
int top;
    const int N=10;
int STACK_EMPTY1(int S[N])       // функция  проверяет стек на переполнение
{
    if (top==(N-1)) 
                return true;
    else return false;
};
 
void PUSH (int S[N],int  x)        //  функция заносит х в стек
{
    if (STACK_EMPTY1(S)) 
printf("error underflow \n");
    else top=top+1;
         S[top]=x;
};
 
int STACK_EMPTY(int S[N])   //функция проверяет пуст ли стек
{
if (top==0) 
          return true;
else return false;
};
 
int POP(int S[N])           // извлечение из стека 
{
if (STACK_EMPTY(S))
             printf("error underflow \n");
else top=top-1;
int f=S[top+1];
     return f;
};
 
int _tmain()
{
setlocale (LC_ALL, "Russian");
    int S[N];
    int y;
        int u=1;
        do 
        {
 
printf("Произведите выбор ваших дальнейших действий 0-добавить в стек 1-извлечь из стека\n");
char w;
scanf ("%s", &w);
switch (w)
{
case '0':
    printf("Вы выбрали действие - добавить в стек, теперь введите число, которое хотите добавить \n");
    scanf ("%d", &y);
    PUSH(S, y);
                        break;
case '1':
 
    printf("Вы выбрали действие - извлечь из стека, теперь введите число, которое хотите извлечь \n");
   scanf ("%d", &y);
    POP(S);
                        break;
};
printf ("Хотите повторить запрос нажмите 1, выйти нажмите 0 \n");
        scanf_s ("%d", &u);
        }
        while (u==1);
 
     system("pause");
     exit(0);
     _getch;
    return 0;
}
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
24.10.2010, 16:21     Стек #5
Цитата Сообщение от White Luna Посмотреть сообщение
int STACK_EMPTY1(int S[N]) // функция проверяет стек на переполнение { if (top=(N-1)) return true; else return false; }; void PUSH (int S[N],int x) // функция заносит х в стек { if (STACK_EMPTY1(S)) printf("error underflow"); else top=top+1; S[top]=x; };
а вы уверены что top не превысит и не попытается записать уже вне массива?
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
24.10.2010, 16:23  [ТС]     Стек #6
Цитата Сообщение от IchMors Посмотреть сообщение
а вы уверены что top не превысит и не попытается записать уже вне массива?
угу, мне сообщением выше указали на ошибку с ==
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
24.10.2010, 16:24     Стек #7
Цитата Сообщение от White Luna Посмотреть сообщение
void PUSH (int S[N],int x) // функция заносит х в стек { if (STACK_EMPTY1(S)) printf("error underflow \n"); else top=top+1; S[top]=x; };
это пропустит добавление в первый элемент массива,

и top нужно назначить сразу, перед каким либо действием.
int top = 0;
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
24.10.2010, 16:25     Стек #8
Зачем кстати это:
C++
1
2
printf("Вы выбрали действие - извлечь из стека, теперь введите число, которое хотите извлечь \n");
    scanf ("%d", &y);
если y нигде не используется) Всё равно будет читаться с верхушки стека.
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
24.10.2010, 16:29     Стек #9
Цитата Сообщение от White Luna Посмотреть сообщение
угу, мне сообщением выше указали на ошибку с ==
всеравно при top = 9 он будет записывать в уже занятую ячейку, тоесть стирать имеющиеся данные

Добавлено через 2 минуты
и измените в конце:
Цитата Сообщение от White Luna Посмотреть сообщение
system("pause"); exit(0); _getch; return 0; }
на
C++
1
2
3
system("pause");
 return 0; 
}
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
24.10.2010, 16:31  [ТС]     Стек #10
Цитата Сообщение от dihlofos Посмотреть сообщение
Зачем кстати это:
C++
1
2
printf("Вы выбрали действие - извлечь из стека, теперь введите число, которое хотите извлечь \n");
    scanf ("%d", &y);
если y нигде не используется) Всё равно будет читаться с верхушки стека.
y нигде кроме этого случая не используется,
я раньше не работала со Стеком поэто му не знаю,...
IchMors
96 / 92 / 4
Регистрация: 16.05.2010
Сообщений: 307
24.10.2010, 16:36     Стек #11
из стека извлекается не какой то требуемый элемент, а последний записаный
http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BA
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
24.10.2010, 16:36  [ТС]     Стек #12
Цитата Сообщение от IchMors Посмотреть сообщение
C++
1
2
3
system("pause");
 return 0; 
}
есле я так заменю, то он в конце проги лагает
есле уж менять то на
C++
1
2
system("pause");
     exit(0);
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
24.10.2010, 16:52     Стек #13
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
#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--];
    }
};
 
int menu(){
    int m;
    std::cout << "\n1 - push element\n2 - pop element\n0 - exit\n> ";
    std::cin >> m;
    return m;
}
 
int main(){
    int i, val;
    std::cout << "Stack size: ";
    std::cin >> i;
    Stack<int> stack(i);
    
    while ( i = menu() ){
        switch ( i ) {
            case 1 :
                std::cout << "\nValue: ";
                std::cin >> val;
                try {
                    stack.push(val);
                }
                catch ( std::string errstr ){
                    std::cerr << "\nError: " << errstr << std::endl;
                }
                break;
            case 2 :
                try {
                    val = stack.pop();
                    std::cout << "\nValue: " << val << std::endl;
                }
                catch ( std::string errstr ) {
                    std::cerr << "\nError: " << errstr << std::endl;
                }
                break;
            default :
                std::cerr << "\nWrong command!" << std::endl;
        }
    }
    
    return 0;
}
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
25.10.2010, 08:24  [ТС]     Стек #14
easybudda, а почему если в массив заносится 1 элемент то извлекаются 2???
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
25.10.2010, 09:06     Стек #15
Цитата Сообщение от White Luna Посмотреть сообщение
а почему если в массив заносится 1 элемент то извлекаются 2?
У меня так не получилось. Точно ничего не перепутали?
Стек
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
26.10.2010, 00:51  [ТС]     Стек #16
а мож пояснить что такое, (вернее что обозначают)
Stack size
Value
exit
push element // добавляет элемент в стек
pop element // извлекает элемент из стека
последние 2 вроде поняла, а вот с первыми 3 что то напряжно
понимаю, что туплю...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.10.2010, 01:14     Стек #17
Цитата Сообщение от White Luna Посмотреть сообщение
size
размер
Цитата Сообщение от White Luna Посмотреть сообщение
Value
значение
Цитата Сообщение от White Luna Посмотреть сообщение
exit
вообще-то выход, а где у меня там такое?
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
26.10.2010, 01:31  [ТС]     Стек #18
exit 3 строчка при выводе
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.10.2010, 01:33     Стек #19
White Luna, Быстрый выход из программы. В плюсах лучше не использовать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2010, 01:40     Стек
Еще ссылки по теме:

Стек C++
C++ Стек
Стек C++

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

Или воспользуйтесь поиском по форуму:
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
26.10.2010, 01:40  [ТС]     Стек #20
угу

Lavroff,
Yandex
Объявления
26.10.2010, 01:40     Стек
Ответ Создать тему
Опции темы

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