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

стек в ручную - C++

Восстановить пароль Регистрация
 
ugodaj
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 42
28.11.2012, 17:14     стек в ручную #1
Помогите создать стек в ручную чтобы работали функции добавление элемента и удаление! ( желательно стек из 4 элементов итегер, и цифры в них от 0 до 50 )
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2012, 17:14     стек в ручную
Посмотрите здесь:

C++ Стек
Стек C++
Стек C++
Почему не правильно работает? Даже в ручную все просчитала, не выходит! C++
C++ Стек
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mmd
13 / 13 / 1
Регистрация: 17.05.2012
Сообщений: 80
28.11.2012, 17:22     стек в ручную #2
в STL все есть
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
28.11.2012, 17:37     стек в ручную #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
#include <iostream>
using namespace std;
////////////////////////////
class Stack
{
 private:
  enum { MAX = 4 };
  int st [ MAX ];
  int top;
 
 public:
  Stack ( ):
 { top = 0; }
  
  void push ( int var ) // поместить в стек
   { st [ ++top ] = var; }
  
  int pop ( ) //взять из стека
   { return st [ top--]; }
};
/////////////////////////////////////
 int main()
 {
   Stack s1;
   s1.push ( 10 );
   s1.push ( 15 );
   s1.push ( 20 );
   s1.push ( 23 );
   s1.push ( 49 );
   
   cout << " 1: " << s1.pop( ) << endl;
   cout << " 2: " << s1.pop( ) << endl; 
   cout << " 3: " << s1.pop( ) << endl;
   cout << " 4: " << s1.pop( ) << endl;
   cout << " 5: " << s1.pop( ) << endl;
   system("PAUSE");
   return 0;
 }
ugodaj
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 42
29.11.2012, 11:29  [ТС]     стек в ручную #4
Цитата Сообщение от mmd Посмотреть сообщение
в STL все есть
А мне кок раз надо реализовать стек не используя STL!

Добавлено через 1 минуту
Цитата Сообщение от fuzzytoozy Посмотреть сообщение
вот пример класса реализующий стек. Надеюсь вам поможет.

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
#include <iostream>
using namespace std;
////////////////////////////
class Stack
{
 private:
  enum { MAX = 4 };
  int st [ MAX ];
  int top;
 
 public:
  Stack ( ):      <<<<------- где то тут ругается!
 { top = 0; }
  
  void push ( int var ) // поместить в стек
   { st [ ++top ] = var; }
  
  int pop ( ) //взять из стека
   { return st [ top--]; }
};
/////////////////////////////////////
 int main()
 {
   Stack s1;
   s1.push ( 10 );
   s1.push ( 15 );
   s1.push ( 20 );
   s1.push ( 23 );
   s1.push ( 49 );
   
   cout << " 1: " << s1.pop( ) << endl;
   cout << " 2: " << s1.pop( ) << endl; 
   cout << " 3: " << s1.pop( ) << endl;
   cout << " 4: " << s1.pop( ) << endl;
   cout << " 5: " << s1.pop( ) << endl;
   system("PAUSE");
   return 0;
 }
Хороший код только в чём то ошибка
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11813 / 6792 / 769
Регистрация: 27.09.2012
Сообщений: 16,856
Записей в блоге: 2
Завершенные тесты: 1
29.11.2012, 11:44     стек в ручную #5
Двоеточие уберите.
вот результат работы кода:
Миниатюры
стек в ручную  
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
30.11.2012, 18:22     стек в ручную #6
извиняюсь, вот рабочий. Сам проверял. =)
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
#include <iostream>
using namespace std;
////////////////////////////
class Stack
{
 private:
  enum { MAX = 5 };
  int st [ MAX ];
  int top;
 
 public:
  Stack ( ): top(0)
 {  }
 
  void push ( int var )
   {
   st [ ++top ] = var;
    }
 
  int pop ( )
   {
   return st [ top-- ]; }
};
/////////////////////////////////////
 int main()
 {
   Stack s1;
   s1.push ( 10 );
   s1.push ( 15 );
   s1.push ( 20 );
   s1.push ( 9 );
 
   cout << " 1: " << s1.pop( ) << endl;
   cout << " 2: " << s1.pop( ) << endl;
   cout << " 3: " << s1.pop( ) << endl;
   cout << " 4: " << s1.pop( ) << endl;
   system("PAUSE");
   return 0;
 }
ugodaj
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 42
04.12.2012, 11:44  [ТС]     стек в ручную #7
Спасибо всё работает отлично! А можете сказать что означает строка в классе enum { MAX = 5 }; ?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11813 / 6792 / 769
Регистрация: 27.09.2012
Сообщений: 16,856
Записей в блоге: 2
Завершенные тесты: 1
04.12.2012, 11:54     стек в ручную #8
Цитата Сообщение от ugodaj Посмотреть сообщение
А можете сказать что означает строка в классе enum { MAX = 5 }; ?
http://www.cyberguru.ru/cpp/cpp-lang...p2-page26.html
ugodaj
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 42
06.12.2012, 13:26  [ТС]     стек в ручную #9
Слушайте мне как бы надо было ещё чтоб были функции добавления и удаления я нашёл вот такой отличный код, но вот незадача выдаёт ошибку, чего куда добавить или где изменить?
1 C:\Dev-Cpp\include\c++\3.4.2\backward\iostream.h:31, from C:\Documents and Settings\DmitrijsSav\Desktop\stek31.cpp In file included from C:/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31, from C:\Documents and Settings\DmitrijsSav\Desktop\stek31.cpp
32:2 C:\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
40 C:\Documents and Settings\DmitrijsSav\Desktop\stek31.cpp `main' must return `int'
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
#include <iostream.h>
 
/*НАША СТРУКТУРА*/
struct List
{
    int x; //информационный элемент
    List *Next,*Head; //Голова стека и указатель на следующий элемент
};
 
/*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В СТЕК  (в список LIFO)*/
void Add(int x, List **MyList) //Принимаем элемент и указатель на указатель на стек
{
    List *temp=new List; //Выделяем память для нового элемента
    temp->x=x; //Записываем в поле x принимаемый в функцию элемент x
    temp->Next=(*MyList)->Head; //Указываем, что следующий элемент это предыдущий
    (*MyList)->Head=temp; //Сдвигаем голову на позицию вперед
}
 
/*ФУНКЦИЯ ОТОБРАЖЕНИЯ СТЕКА*/
void Show(List *MyList) //Нужен только сам стек
{
    List *temp=new List; //Выделяем память под временный элемент
    temp=MyList->Head; //Указываем ему, что его позиция в голове стека
               //с помощью цикла проходим по всему стеку
    while (temp!=NULL)  //выходим при встрече с пустым полем
    {
        cout<<temp->x<<" "; //Выводим на экран элемент стека
        temp=temp->Next; //Переходим к следующему элементу
    }
}
 
/*ФУНКЦИЯ УДАЛЕНИЯ СТЕКА ИЗ ПАМЯТИ*/
void ClearList(List *MyList)
{   
     while (MyList->Head!=NULL)  //Пока по адресу не пусто
     {   
        List *temp=MyList->Head->Next; //Временная переменная для хранения адреса следующего элемента
        delete MyList->Head; //Освобождаем адрес обозначающий начало
        MyList->Head=temp; //Меняем адрес на следующий
     }
}
 
void main()
{
    List *MyList=new List; //Выделяем память для стека
    MyList->Head=NULL; //Во избежание ошибок инициализируем первый элемент
 
    for (int i=0;i<10;i++) Add(i,&MyList); //Заносим данные в стек
    Show(MyList); //Выводим стек на экран
 
void ClearList(List *MyList); //Очищаем память.
   
}
fuzzytoozy
8 / 8 / 1
Регистрация: 23.11.2012
Сообщений: 94
06.12.2012, 14:42     стек в ручную #10
А можете сказать что означает строка в классе enum { MAX = 5 }; ?
данная строка позволяет инициализировать переменную в классе константным значением. Объявление const int = 5 не возможно сделать в классе, поэтому используется тип перечисления для определения переменной. Сделано это для того, чтобы не использовать глобальной переменной
ugodaj
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 42
08.01.2013, 11:24  [ТС]     стек в ручную #11
Никто не может помочь в чём ошибка?
tokar2
25 / 25 / 1
Регистрация: 09.11.2012
Сообщений: 229
08.01.2013, 11:43     стек в ручную #12
У меня есть реализация стека на псевдокоде, думаю не трудно будет перевести на c + +

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
function MAKENULL (STACK S)
      S.top = maxlenght+1
 
function EMPTY (STACK S) {
      if S.top > maxlenght
      then return true
      else return false
 
function TOP (STACK S)
      if EMPTY(S)
then error (“стек порожній”)
      else return S.elementtype[S.top]
}
 
function POP (STACK S)
      if EMPTY(S)
then error (“стек порожній”)
      else S.top = S.top + 1
}
 
function PUSH (elementtype x, STACK S)
      if S.top == 1
then error (“Стек повний”)
      else
            S.top = S.top1;
            S.elements[S.top] = x;
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11813 / 6792 / 769
Регистрация: 27.09.2012
Сообщений: 16,856
Записей в блоге: 2
Завершенные тесты: 1
08.01.2013, 11:43     стек в ручную #13
Цитата Сообщение от ugodaj Посмотреть сообщение
40 C:\Documents and Settings\DmitrijsSav\Desktop\stek31.cpp `main' must return `int'
C++
1
int main()//а не void main()
Остальное варнинги. Вам сообщают, что фаил iostream.h устарел
ugodaj
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 42
08.01.2013, 12:12  [ТС]     стек в ручную #14
спасибо

Добавлено через 4 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
int main()//а не void main()
Остальное варнинги. Вам сообщают, что фаил iostream.h устарел
Если я меняю на int main() то выдаёт такие ошибки:
1 C:\Dev-Cpp\include\c++\3.4.2\backward\iostream.h:31, from C:\Documents and Settings\DmitrijsSav\Desktop\nerabo4ij stek.cpp In file included from C:/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31, from C:\Documents and Settings\DmitrijsSav\Desktop\nerabo4ij stek.cpp
1 C:\Documents and Settings\DmitrijsSav\Desktop\nerabo4ij stek.cpp from C:\Documents and Settings\DmitrijsSav\Desktop\nerabo4ij stek.cpp
32:2 C:\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11813 / 6792 / 769
Регистрация: 27.09.2012
Сообщений: 16,856
Записей в блоге: 2
Завершенные тесты: 1
08.01.2013, 12:17     стек в ручную #15
C++
1
2
#include <iostream>
using namespace std;
можно
C++
1
#include <iostream>
и при обращении к данным из пространства std, обращаться к данному пространству имен:
C++
1
std::cout<<"ffffffffffffff";
ugodaj
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 42
08.01.2013, 12:57  [ТС]     стек в ручную #16
Спасибо всё работает )
ugodaj
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 42
09.01.2013, 13:20  [ТС]     стек в ручную #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
#include <iostream>
using namespace std;
int x;
struct List
{
    int x; 
    List *Next,*Head; 
};
 
int main(){
 
 
 
    char key;
    cout<<"Select the digit from menu:\n";
    cout<<"Press 1 for add digit in Steck";
    cout<<"Press 2 for delete digit from Steck";
    cout<<"Press 3 for show Steck";
    cin>>key;
    
    switch(key){
    case  '1':  
          [B]std::cin>>x;
          void Add(int x, List **MyList); 
               {
                List *temp=new List; 
                temp->x=x; 
                temp->Next=(*MyList)->Head; 
                (*MyList)->Head=temp; 
                }   [/B]
          break; 
    case  '2':     
          void ClearList(List *MyList)
               {   
               while (MyList->Head!=NULL)  
                     {   
                     List *temp=MyList->Head->Next; 
                     delete MyList->Head; 
                     MyList->Head=temp; 
                     }
               }
          break;
    case  '3':   
          void Show(List *MyList) 
               {
               List *temp=new List; 
               temp=MyList->Head; 
               while (temp!=NULL) 
                     {
                      std::cout<< temp->x<<" "; 
                      temp=temp->Next; 
                     }
               } 
          break; 
          default:   
          cout<<"\nError!!! This operator isn't correct\n";
          break;
 
void funkcion()
     {
    List *MyList=new List;
    MyList->Head=NULL; 
    for (int i=0;i<4;i++) Add(i,&MyList);
    Show(MyList); 
    void ClearList(List *MyList); 
    }
 return 0;   
             }
}
void funkcion()
     {
    List *MyList=new List;
    MyList->Head=NULL; 
    for (int i=0;i<4;i++) Add(i,&MyList);
    Show(MyList); 
    void ClearList(List *MyList); 
    }
с 24 по 30 строку и он там говорит что MyList undercleared что изменить чтоб он видел MyList как в функции переменную и нечего не требовал от меня ?

Добавлено через 19 минут
Во я чуток переделал но всёравно выдёт там же ту же ошибку
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 <iostream>
using namespace std;
int x;
struct List
{
    int x; 
    List *Next,*Head; 
};
  void Add(int x, List **MyList);
  void ClearList(List *MyList);
  void Show(List *MyList);
int main()
       {{
    List *MyList=new List;
    MyList->Head=NULL; 
    for (int i=0;i<4;i++) Add(i,&MyList);
    Show(MyList); 
    void ClearList(List *MyList); 
    }
 return 0;   
             }
void vibor()
{
 
 
 
    char key;
    cout<<"Select the digit from menu:\n";
    cout<<"Press 1 for add digit in Steck\n";
    cout<<"Press 2 for delete digit from Steck\n";
    cout<<"Press 3 for show Steck\n";
    cin>>key;
    
    switch(key){
    case  '1':  
          std::cin>>x;
        
               {
                List *temp=new List; 
                temp->x=x; 
                temp->Next=(*MyList)->Head; 
                (*MyList)->Head=temp; 
                } 
          break; 
    case  '2':     
          
               {   
               while (MyList->Head!=NULL)  
                     {   
                     List *temp=MyList->Head->Next; 
                     delete MyList->Head; 
                     MyList->Head=temp; 
                     }
               }
          break;
    case  '3':   
           
               {
               List *temp=new List; 
               temp=MyList->Head; 
               while (temp!=NULL) 
                     {
                      std::cout<< temp->x<<" "; 
                      temp=temp->Next; 
                     }
               } 
          break; 
          default:   
          cout<<"\nError!!! This operator isn't correct\n";
          break;
 
 
 
}}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2013, 14:23     стек в ручную
Еще ссылки по теме:

Правильно ли составила программку?Проверяю в ручную решение - не сходится( C++
C++ &,|, ^, приведите пример на каждую операцию бе компелятора а в ручную , для объяснения работы этих операций
C++ Заменить функцию tolower на ручную функцию

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11813 / 6792 / 769
Регистрация: 27.09.2012
Сообщений: 16,856
Записей в блоге: 2
Завершенные тесты: 1
09.01.2013, 14:23     стек в ручную #18
MyList - локальная переменная для main
Yandex
Объявления
09.01.2013, 14:23     стек в ручную
Ответ Создать тему

Метки
ручную, стек
Опции темы

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