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

Модель стека - C++

Восстановить пароль Регистрация
 
VanUliK
 Аватар для VanUliK
13 / 13 / 3
Регистрация: 13.02.2012
Сообщений: 218
Записей в блоге: 1
09.12.2012, 19:46     Модель стека #1
Не знаю где создать эту тему, поэтому создал тут:
Есть вот такое задание:
Модель стека
1. Исходные данные:
стек списковой структуры,
перечень операций со стеком: создание, включение элемента, выборка элемента, извлечение данных, уничтожение.
2. Результаты работы модели должны включать:
меню с перечнем всех операций над стеком,
печать содержимого стека.
решаемой задачи в структурной организации операционной системы.
Вот хоть убейте, не могу понять как мне это реализовать всё... это контрольная работа.
Помогите, пожалуйста.

Добавлено через 16 часов 47 минут
ни у кого никаких предположений?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.12.2012, 20:15     Модель стека #2
std::stack
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.12.2012, 20:16     Модель стека #3
Цитата Сообщение от go Посмотреть сообщение
std::stack
Ни в коем случае.
svkpro
 Аватар для svkpro
8 / 8 / 0
Регистрация: 07.12.2012
Сообщений: 143
09.12.2012, 20:18     Модель стека #4
лови
Код
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <windows.h>
#define  size_str 200
using namespace std;

//объявляем структуру
typedef struct kniga { 
char shifr[4]; 
char avtor[15]; 
char nazv[15];
char izdat[15];
char god[6];
struct kniga* next; 
 } Kniga;

Kniga* top = NULL;
int t;

void push(char* shifr, char* avtor, char* nazv, char* izdat, char* god)//добавление 
 {
	 if(t>=20)cout<<"стек полон!"<<endl;
	 Kniga* ptr = (Kniga *)malloc(sizeof(Kniga)); 
	 strcpy(ptr->shifr,shifr);
	 strcpy(ptr->avtor,avtor); 
	 strcpy(ptr->nazv,nazv);
	 strcpy(ptr->izdat,izdat);
	 strcpy(ptr->god,god);
	 ptr->next = top;
	 t++;
	 top = ptr;
	 
 }

void pop()//взятие и удаление с записью в файл
{ 
 if(top != NULL) 
	 { 
	 Kniga* ptr = top->next; 
	 printf("%s ",top->shifr); 
	 printf("%s ",top->avtor); 
	 printf("%s ",top->nazv); 
	 printf("%s ",top->izdat); 
	 printf("%s - deleted\n\n",top->god); 
 char strz[100];
	 strcpy(strz,top->shifr);
	 strcat(strz,";");
	 strcat(strz,top->avtor);
	 strcat(strz,";");
	 strcat(strz,top->nazv);
	 strcat(strz,";");
	 strcat(strz,top->izdat);
	 strcat(strz,";");
	 strcat(strz,top->god);
	 strcat(strz,";");
FILE* fz;
	 fz=fopen("D:\\udal.txt","a+");
	 fputs(strz, fz);
	 fputc('\n',fz);
	 fclose(fz);
	 free(top);
	 top = ptr;
	 t--;
	 }
 else 
	 cout<<"стек пуст"<<endl;
}

void show_stack() 
{
 
 Kniga* ptr = top;
 if(ptr==NULL){
	 cout<<"стек пуст!"<<endl;
 }
 else
 while(ptr != NULL) 
 { 
	 printf("%s ",ptr->shifr);
	 printf("%s ",ptr->avtor);
	 printf("%s ",ptr->nazv);
	 printf("%s ",ptr->izdat);
	 printf("%s \n\n",ptr->god);		
 ptr = ptr->next; 
 } 
}


void p1(){ //заполнение
	char ch_key;
    bool bMENU = true;
    while(bMENU)
    {
		system("cls");
        cout<<"1)  с консоли "<<endl;
        cout<<"2)  из файла "<<endl;
        cout<<"ESC Выход"<<endl<<endl;
        cout<<"пожалуйста выберите пункт меню"<<endl;
		char str1[4]; 
		char str2[15];
		char str3[15];
		char str4[15];
		char str5[6];
		switch((ch_key = _getch()))
        {
//заполнение стека с консоли
        case '1':system("cls");
					while(true){
					 	cin>>str1;
						cin>>str2;
						cin>>str3;
						cin>>str4;
						cin>>str5;
						cout<<endl;
						push(str1,str2,str3,str4,str5);
						system("cls");
						show_stack();
						cout<<"элемент успешно добавлен в стек!"<<endl<<endl;
						cout<<endl;
						cout<<"Enter - продолжить"<<endl;
						cout<<"Esc - выйти"<<endl;
						int n; 
						n = getch();
					if(n == 27)break; 
						system("cls");
						}
						cout<<endl;
						cout<<"для продолжения нажмите Enter";
						cin.get();break;
//заполнение из файла
		case '2':system("cls");
				FILE*cfPtr;
				fopen("zapoln.txt","r");
				if((cfPtr=fopen("zapoln.txt","r"))==NULL){
					cout<<"файл не найден!";
				}
				else
					while(true){
						char strz[100];
						fgets(strz,size_str,cfPtr);
						char *p1,*p2,*p3,*p4,*p5;
						if(feof(cfPtr))break;
						p1=strtok(strz,";");
						p2=strtok(NULL, ";");
						p3=strtok(NULL, ";");
						p4=strtok(NULL, ";");
						p5=strtok(NULL, ";");
						push(p1,p2,p3,p4,p5);
					}
					system("cls");
					show_stack();
					cout<<"элементы успешно добавлены в стек!"<<endl<<endl;
					fclose(cfPtr);
						cout<<endl;
						cout<<"для продолжения нажмите Enter";
						cin.get();break;				
					case  27:bMENU = false;
						cout<<endl;
						cout<<"программа возвращается в главное меню!"<<endl<<endl;break;
					default:cout<<endl;
						cout<<"вы ввели неверный символ!"<<endl;
						cout<<endl;
						cout<<"для продолжения нажмите Enter";
						cin.get();break;
					}
			}
	system("pause");
}
void p2(){//удаление
	char ch_key;
    bool bMENU = true;
    while(bMENU)
    {
		system("cls");
        cout<<"1)  безвозвратно"<<endl;
        cout<<"2)  с сохранением в файл"<<endl;
        cout<<"ESC Выход"<<endl<<endl;
        cout<<"пожалуйста выберите пункт меню"<<endl;
		
        switch((ch_key = _getch()))
        {
        case '1':system("cls");
				 if(top != NULL)//удаление безвозвратно 
					 while(true)
					 { 
					 Kniga* ptr = top->next; 
					 printf("%s ",top->shifr); 
					 printf("%s ",top->avtor); 
					 printf("%s ",top->nazv); 
					 printf("%s ",top->izdat); 
					 printf("%s - deleted\n\n",top->god);
					 free(top);
					 top = ptr;
					 t--;
					 if(t<=0)break;
					 cout<<"1) удалить следующий элемент"<<endl;
					 cout<<"ESC Выход"<<endl<<endl;
					 char ch_key_t;
					 switch((ch_key_t =_getch()))
					 {
					 case '1':break;
					 case 27 :goto gt;
					 }
					}
				 else
					 cout<<"стек пуст!"<<endl;
					 cout<<endl;
					 gt:
					 cout<<"для продолжения нажмите Enter";
					 cin.get();break;
		case '2':system("cls");//удаление с записью в файл
				 if(top != NULL)
					 while(true)
					 { 
					 cout<<"1) удалить следующий элемент"<<endl;
					 cout<<"ESC Выход"<<endl<<endl;
					 char ch_key_t;
					 switch((ch_key_t =_getch()))
					 {
					 case '1':break;
					 case 27 :goto gt2;
					 }
						pop();
						if(t<=0)break;
					 }
				 else
					 cout<<"стек пуст!"<<endl;
					 cout<<endl;
					 gt2:
					 cout<<"для продолжения нажмите Enter";
					 cin.get();break;				
        case  27:bMENU = false;
				 cout<<endl;
				 cout<<"программа возвращается в главное меню!"<<endl<<endl;break;
        default:cout<<endl;
				 cout<<"вы ввели неверный символ!"<<endl;
				 cout<<endl;
				 cout<<"для продолжения нажмите Enter";
				 cin.get();break;
        }
    }
    system("pause");
}
void p3(){//очистка
	char ch_key;
    bool bMENU = true;
    while(bMENU)
    {
		system("cls");
        cout<<"1)  безвозвратно"<<endl;
        cout<<"2)  с сохранением в файл"<<endl;
        cout<<"ESC Выход"<<endl<<endl;
        cout<<"пожалуйста выберите пункт меню"<<endl;
        switch((ch_key = _getch()))
        {
        case '1':system("cls");//очистка безвозвратно 
				 while(top != NULL)
					 { 
					 Kniga* ptr = top->next; 
					 printf("%s ",top->shifr); 
					 printf("%s ",top->avtor); 
					 printf("%s ",top->nazv); 
					 printf("%s ",top->izdat); 
					 printf("%s - deleted\n",top->god);
					 free(top);
					 top = ptr;
					 t--;
					}
					 cout<<"стек пуст!"<<endl;
					 cout<<endl;
					 cout<<"для продолжения нажмите Enter";
					 cin.get();break;
		case '2':system("cls");//очистка с записью в файл
				 if(top != NULL)
					 while(true)
					 { 
						pop();
						if(t<=0)break;
					 }
				 else
				 cout<<endl;
				 cout<<"для продолжения нажмите Enter";
				 cin.get();break;		
				 cout<<endl;
				 cout<<"для продолжения нажмите Enter";
				 cin.get();break;				
        case  27:bMENU = false;
				 cout<<endl;
				 cout<<"программа возвращается в главное меню!"<<endl<<endl;break;
        default:cout<<endl;
				 cout<<"вы ввели неверный символ!"<<endl;
				 cout<<endl;
				 cout<<"для продолжения нажмите Enter";
				 cin.get();break;
        }
    }
    system("pause");
}
void p4(){//вывод элементов
	char ch_key;
    bool bMENU = true;
    while(bMENU)
    {
		system("cls");
        cout<<"1)  на экран"<<endl;
        cout<<"2)  в файл"<<endl;
        cout<<"ESC Выход"<<endl<<endl;
        cout<<"пожалуйста выберите пункт меню"<<endl;
        switch((ch_key = _getch()))
        {
        case '1':system("cls");//показ на экран
				 show_stack();
				 cout<<endl;
				 cout<<"для продолжения нажмите Enter";
				 cin.get();break;
		case '2':system("cls");{//показ с записью в файл
				 if(top != NULL)
					while(true)
					 { 
					 Kniga* ptr = top->next; 
					 printf("%s ",top->shifr); 
					 printf("%s ",top->avtor); 
					 printf("%s ",top->nazv); 
					 printf("%s ",top->izdat); 
					 printf("%s \n\n",top->god); 
				 char strz[100];
					 strcpy(strz,top->shifr);
					 strcat(strz,";");
					 strcat(strz,top->avtor);
					 strcat(strz,";");
					 strcat(strz,top->nazv);
					 strcat(strz,";");
					 strcat(strz,top->izdat);
					 strcat(strz,";");
					 strcat(strz,top->god);
					 strcat(strz,";");
				FILE* fz;
					 fz=fopen("D:\\pokaz.txt","a+");
					 fputs(strz, fz);
					 fputc('\n',fz);
					 fclose(fz);
					 top = ptr;
					 if(top==NULL)break;	 
					 }
				 else{ 
					 cout<<"стек пуст"<<endl;
				 }
				}
								 cout<<endl;
				 cout<<"для продолжения нажмите Enter";
				 cin.get();break;				
        case  27:bMENU = false;
				 cout<<endl;
				 cout<<"программа возвращается в главное меню!"<<endl<<endl;break;
        default:cout<<endl;
				 cout<<"вы ввели неверный символ!"<<endl;
				 cout<<endl;
				 cout<<"для продолжения нажмите Enter";
				 cin.get();break;
        }
    }
    system("pause");
}
void p5(){//количество элементов
	char ch_key;
    bool bMENU = true;
    while(bMENU)
    {
		system("cls");
        cout<<"В стеке "<<t<<" элементов"<<endl<<endl;;
        cout<<"ESC Выход"<<endl<<endl;
        switch((ch_key = _getch()))
        {
        case  27:bMENU = false;
				 cout<<endl;
				 cout<<"программа возвращается в главное меню!"<<endl<<endl;break;
        default:cout<<endl;
				 cout<<"вы ввели неверный символ!"<<endl;
				 cout<<endl;
				 cout<<"для продолжения нажмите Enter";
				 cin.get();break;
        }
    }
    system("pause");
}


 
int main()
{
	//locale::global(locale(""));
	//setlocale( LC_ALL,"rus" );
	system("chcp 1251");//кодировка символов
	
    char ch_key;
    bool bMENU = true;
    while(bMENU)
    {
		system("cls");
        cout<<"1)  Заполнение стека"<<endl;
        cout<<"2)  Удаление элемента из стека"<<endl;
        cout<<"3)  Очистка стека"<<endl;
        cout<<"4)  Вывод элементов, содержащихся в стеке"<<endl;
        cout<<"5)  Вывод количества элементов в стеке"<<endl;
        cout<<"ESC Выход"<<endl<<endl;
        cout<<"пожалуйста выберите пункт меню"<<endl;
        switch((ch_key = _getch()))
        {
        case '1':
            p1();
            break;
        case '2':
            p2();
            break;
        case '3':
            p3();
            break;
        case '4':
            p4();
            break;
        case '5':
            p5();
            break;
        case 27:
            bMENU = false;
			cout<<endl;
            cout<<"программа завершает свою работу!"<<endl;
            break;
        default:
            cout<<"вы ввели неверный символ!"<<endl;
			system("pause");
            break;
        }
    }
	cout<<endl;
    system("pause");
    return 0;
}
это мое задание под себя переделаете)
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.12.2012, 20:19     Модель стека #5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ни в коем случае.
Цитата Сообщение от VanUliK Посмотреть сообщение
это контрольная работа.
Значит где-то 40-45 мин. на выполнение. Просто запихнуть в свой класс std::stack.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.12.2012, 20:37     Модель стека #6
Цитата Сообщение от go Посмотреть сообщение
Значит где-то 40-45 мин. на выполнение. Просто запихнуть в свой класс std::stack.
Вот именно. КОНТРОЛЬНАЯ. а значит контролирует не навыки копипастинга и не навык "написать <>угловые скобочки рядом с именем стандартного шаблона", а понимание динамических структур данных.
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
#include <cstdio>
typedef int T;
class stack{
protected:
    struct element{
        T data;
        struct element* next;
    }*begin;
    void free_stack(struct element* arg){
        if (arg){
            free_stack(arg->next);
            delete arg;
        }
    }
public:
    stack():begin(NULL){};
    void push(T x){
        struct element* newEl=new struct element;
        newEl->data=x;
        newEl->next=begin;
        begin=newEl;
    }
    T pop(){
        if (!begin) return -1;
        T value=begin->data;
        struct element* newEl=begin->next;
        delete begin;
        begin=begin->next;
        return value;   
    }
    void clear(){
        free_stack(begin);
        begin=NULL;
    }
    void output(){
        struct element* cur=begin;
        while(cur){
            printf("%d, ", cur->data);
            cur=cur->next;
        }
        putchar('\n');
    }
    ~stack(){
        free_stack(begin);
    }
};
int main(){
    stack st0;
    for (int i=1; i<256; i*=2)
        st0.push(i);
    st0.output();
    getchar();
    return 0;
}
VanUliK
 Аватар для VanUliK
13 / 13 / 3
Регистрация: 13.02.2012
Сообщений: 218
Записей в блоге: 1
10.12.2012, 12:10  [ТС]     Модель стека #7
Спасибо большое за ответы, пример svkpro более подходящий, т.к. мне надо показать контрольные примеры (5 шт) я так понимаю это те 5 операций со стеком, которые можно осуществить: добавить, удалить, вершина, размер и что-то ещё (что, не знаю). И нужна блок-схема алгоритма.
VanUliK
 Аватар для VanUliK
13 / 13 / 3
Регистрация: 13.02.2012
Сообщений: 218
Записей в блоге: 1
13.12.2012, 03:14  [ТС]     Модель стека #8
ап.... очень нужна помощь... в пятницу если не сделаю, будет опа...
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,399
13.12.2012, 03:35     Модель стека #9
go, там проблема будет с "печать содержимого стека."
Хотя, по-моему, идиотское задание, противоречит абстрактной модели стека, т.к. требуется либо перезаполнять, либо иметь обращение через [], либо проходится от начала до конца (иметь доступ к первому элементу). А стек ли это уже получится?

Kuzia domovenok, вы пишите
контролирует не навыки копипастинга
рядом ваша реализация данного алгоритма. И чем это лучше?

Добавлено через 5 минут
VanUliK, если совсем по простому, то можно реализовать стек, завернув его вокруг массива.
Стек на основе статического массива
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
#include <iostream>
#include <cstddef>
#include <string>
 
class Teacher
{
    public:
        Teacher() {}
        Teacher(std::string name, std::string surname):
            _name(name), _surname(surname) {}
        void set(std::string name, std::string surname)
        {
            _name = name;
            _surname = surname;
        }
        friend std::ostream& operator<< (std::ostream &output, const Teacher &t)
        {
            output<< "Name: "<< t._name<< std::endl
                  << "Surname: "<< t._surname<< std::endl;
            return output;
        }
    private:
        std::string _name, _surname;
};
 
 
class MyStack
{
    public:
        MyStack(): counter(0) {}
        void push(const Teacher &el)
        {
            if (counter < N) t[counter++] = el;
        }
        void pop()
        {
            if (counter > 0) counter--;
        }
        const std::size_t size() const {return counter; }
        bool empty() {return counter == 0; }
        const Teacher& top() const
        {
            if (counter > 0) return t[counter - 1];
        }
    private:
        enum {N = 10 };
        Teacher t[N];
        std::size_t counter;
};
 
 
 
 
int main()
{
    MyStack s;
    s.push (Teacher ("Ivan", "Petrov"));
    s.push (Teacher ("Vladimir", "Voronov"));
    while (!s.empty())
    {
        std::cout<< s.top()<< std::endl;
        s.pop();
    }
    return 0;
}
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
13.12.2012, 05:29     Модель стека #10
ну вот вроде так ничего получился.
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
111
112
113
114
115
116
117
118
#include <iostream>
#include <iomanip>
#include <exception>
 
typedef unsigned int uint;
 
namespace myspace
{
    template<typename T>
    class stack
    {
    public:
 
        stack ()
        {
            head = (node*) NULL;
            siz = 0;
        }
 
        ~stack(){}
 
        void push (T val)
        {
            ++siz;
            node *t = new node;
 
            t->val = val;
 
            if (head == (node*) NULL)
                t->next = NULL;
            else
                t->next = head;
            head = t;
        }
 
        T pop ()
        {
            --siz;
            node *t;
            T value = (T) 0;
 
            if (this->empty())
                throw;
            else
            {
                t = head;
                value = head->val;
                head = t->next;
                delete t;
            }
 
            return value;
        }
 
        bool empty () { return (bool) (head == (node*)NULL);}
 
        uint size () {return this->siz;}
 
    private:
        struct node
        {
            T val;
            node *next;
        };
        node *head;
        uint siz;
    };
}
//exmaple data structure for push to stack
struct some
{
    int x, y;
 
    some (){}
    some (int __nil) : x(0), y(0) {}
    some (int __x, int __y) : x(__x), y(__y){}
    ~some(){}
 
    some &operator= (const some &rigth)
    {
        this->x = rigth.x;
        this->y = rigth.y;
        return *this;
    }
};
 
int main()
{
    //example for int
    myspace::stack<int> s;
 
    for (int i = 0; i < 10; ++i)
        s.push (i);
 
    while ( !s.empty () )
        std::cout << std::setw( 3 )  << s.pop();
    std::cout << '\n';
 
    //example for struct
    some val;
    myspace::stack<some> x;
 
    for (int i = 0; i < 5; ++i)
    {
        val.x = i + i;
        val.y = i * val.x;
        x.push (val);
    }
 
    while (!x.empty ())
    {
        val = x.pop ();
        std::cout << "val.x = " << std::setw (3) << val.x;
        std::cout << " val.y = " << std::setw (3) << val.y << '\n';
    }
 
    return 0;
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.12.2012, 22:42     Модель стека #11
Цитата Сообщение от activnaya Посмотреть сообщение
ну вот вроде так ничего получился.
А почему деструктор пустой?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 00:44     Модель стека
Еще ссылки по теме:

Программа на C++, которая переводит цветовую модель RGB в модель HSV C++
Удалить элемент из стека по условию и добавить элемент в начало стека C++
C++ Реализация стека

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

Или воспользуйтесь поиском по форуму:
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
15.12.2012, 00:44     Модель стека #12
Цитата Сообщение от soon Посмотреть сообщение
А почему деструктор пустой?
просто забыла оформить
Yandex
Объявления
15.12.2012, 00:44     Модель стека
Ответ Создать тему
Опции темы

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