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

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

Войти
Регистрация
Восстановить пароль
 
Maximilan
2 / 2 / 0
Регистрация: 03.10.2012
Сообщений: 15
#1

Просмотр элементов стека - C++

28.03.2014, 12:30. Просмотров 949. Ответов 11
Метки нет (Все метки)

Столкнулся с проблемой, во время просмотра элементов стека. Просто выгрузка элементов не устраивает, поэтому решил организовать запись каждого верхнего элемента в массив, а потом начиная с конца массива затолкнуть все элементы обратно в стек. Работаю с библиотекой string.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int j=0;
                size = st.size;
    
                string *st_buf= new string[size];
            if (!st.empty())
            {
            while (!st.empty())
                {
                    cout<<st.top()<<endl;
                        j++;
                        strcpy (st_buf[size-j],st.top);
                    st.pop();
                }
            
            for (j = size-1;j>=0;j--)
                {
                    st.push(st_buf[j]);
                }
            }
            else cout<< "Стек пустой!"<<endl;
В этом случае имеем ошибку:error C2664: strcpy: невозможно преобразовать параметр 1 из "std::string" в "char *".
В случае присваивания строчки
C++
1
st_buf[size-j]=st.top
, имеем ошибку =: невозможно преобразовать "overloaded-function" в "std::string".
В общем понятное дело, что strcpy заточена под работу с строками типа char, а не string.
Идея моя состоит в том, что верхний элемент перед удалением записываем в массив, а после с конца массива записываем элементы в стек. Так вот, как правильно реализовать данную функцию без использования char строк ( просто решил до последнего работать с библиотекой string)?
Заранее спасибо за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2014, 12:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Просмотр элементов стека (C++):

просмотр стека - C++
вот так смотрю содержимое ВСЕГО стека: while(!mystack.empty()) { cout&lt;&lt;mystack.top()&lt;&lt;&quot; &quot;; mystack.pop(); } cout&lt;&lt;endl; ...

Создать стек из вещественных чисел; найти максимальный элемент в стеке; организовать просмотр данных стека - C++
Создать стек из вещественных чисел. Определить максимальный элемент в стеке. Организовать просмотр данных стека.

Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода и вывода элементов стека. Ввести эталонный символ. - C++
Создать стек для символов. Максимальный размер стека вводится с экрана. Создать функции для ввода и вывода элементов стека. Ввести...

Двунаправленный список (добавление/удаление элементов в голову, просмотр списка, реализовать дублирование элементов с заданным значением) - C++
Здравствуйте! Помогите написать программу, обеспечивающую работу с двунаправленным нециклическим списком: добавление/удаление элементов в...

Структура стек (: добавить элемент в стек, удалить элемент из стека, получить значение с вершины стека, размер стека...) - C++
Всем привет,ребят помогите пожалуйста с лабой,вообще без понятия про стеки:( Может кто то делал,или встречался с таким заданием: ...

Удаление элементов из стека - C++
Задание: 10. В созданном списке определить количество элементов, имеющих значения, меньше среднего значения от всех элементов, и удалить...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
SatanaXIII
Супер-модератор
Эксперт С++
5610 / 2644 / 245
Регистрация: 01.11.2011
Сообщений: 6,506
Завершенные тесты: 1
28.03.2014, 13:22 #2
Как насчет
C++
1
 st_buf[size-j] = st.top();
И какого типа стек? std::string?
Maximilan
2 / 2 / 0
Регистрация: 03.10.2012
Сообщений: 15
28.03.2014, 14:26  [ТС] #3
SatanaXIII, В таком случае ошибка
=: невозможно преобразовать "overloaded-function" в "std::string".
Стек определяю как
C++
1
stack <string> st;
Подключаю отдельно библиотеку string.
SatanaXIII
Супер-модератор
Эксперт С++
5610 / 2644 / 245
Регистрация: 01.11.2011
Сообщений: 6,506
Завершенные тесты: 1
28.03.2014, 14:32 #4
А ставите ли вы вот эти скобочки:
Цитата Сообщение от SatanaXIII Посмотреть сообщение
st_buf[size-j] = st.top();
Если да, то приводите полный код.
Maximilan
2 / 2 / 0
Регистрация: 03.10.2012
Сообщений: 15
28.03.2014, 14:49  [ТС] #5
SatanaXIII, Добавил скобки, моя невнимательность сыграла злую шутку. Появилась другая ошибка.
Полный код:
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
119
120
121
122
123
#include "stdafx.h"
#include <stdio.h>
#include <conio.H>
#include <iostream>
#include <math.h>
#include <stack>
#include <string>
#include <string.h>
 
using namespace std; 
 
int menu_text ()
{   cout<<"__________________________"<<endl;
    cout<<"1. Добавить элемент стека"<<endl;
    cout<<"2. Выгрузить элементы стека"<<endl;
    cout<<"3. Посмотреть верхний элемент"<<endl;
    cout<<"4. Посмотреть все элементы"<<endl;
    cout<<"__________________________"<<endl;
    return 1;
}
 
void main () 
{
    setlocale(LC_ALL, "Russian");
    string s; int size;
    int menu = 0;int choise =0,n; stack <string> st;
    // menu
while (menu !=9) 
{    
    menu_text(); // запускаем функцию для вывода пунктов меню
    cout<<"Выберете пункт меню"<<endl;
    cin>>menu; cout<<endl;
    
    switch (menu) 
    {
        case 1: // ввод элемента стекаs
            system ("cls");
            cout<<"Введите  строчный элемент стека "<<endl;
            cout<<"Вводим один элемент (1) или несколько (2),"<<endl;
                cin>>choise;cout<<endl;
                cin.ignore();
                switch (choise)
                {
                    case 1:
                        getline(cin,s); 
                        st.push (s);
                    break;
 
                    case 2:
                        cout<<"Введите количество вводимых строк"<<endl;
                        cin>>n; cout<<endl;
                        cin.ignore();
                        for (int i=0;i<n;i++){
                            cout<<i+1<<".";getline(cin,s);cout<<endl;
                            st.push (s);
                        }
                    break;
                    
                    default:
                        cout<<"Ошибка ввода"<<endl;
                    break;
 
                }
                
            
        break;
 
        case 2:
            system ("cls");
            cout<<"Элементы стека"<<endl;
            if (!st.empty())
            {
            while (!st.empty())
                {
                    cout<<st.top()<<endl;st.pop();
                }
            }
            else cout<< "Стек пустой!"<<endl;
        break;
 
        case 3:
            system ("cls");
            
            if (!st.empty()){
                cout << "Верхний элемент: "<<st.top()<<endl;
            }
            else cout<< "Стек пустой!"<<endl;
        break;
        
        case 4:
            system ("cls");
            cout<<"ПРосмотр Элементов стека"<<endl;
             
                int j=0;
                size = st.size;
    
                string *st_buf= new string[size];
            if (!st.empty())
            {
            while (!st.empty())
                {
                    cout<<st.top()<<endl;
                        j++;
                        st_buf[size-j]=st.top();
                    st.pop();
                }
            
            for (j = size-1;j>=0;j--)
                {
                    st.push(st_buf[j]);
                }
            }
            else cout<< "Стек пустой!"<<endl;
        break;
 
        default:
            cout<<"Ошибка ввода"<<endl;
        break;
        
    }
}
 
}
В строчке 95 ошибка вида:
error C2440: =: невозможно преобразовать "unsigned int (__thiscall std::stack<_Ty>::* )(void) const" в "int"
Все по ходу из-за того, что размер массива должен быть указан в константе, или пока не доступно для моего ума.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.03.2014, 14:56 #6
C++
1
size = st.size;
вот так
C++
1
size = st.size();
Maximilan
2 / 2 / 0
Регистрация: 03.10.2012
Сообщений: 15
28.03.2014, 15:04  [ТС] #7
aLarman, SatanaXIII, Спасибо. Двойная невнимательность. Стыдно аж прям.
Последний вопрос, компилятор выдает так же ошибку при присутствии
C++
1
2
3
        default:
            cout<<"Ошибка ввода"<<endl;
        break;
В частности компилятор пропускает инициализацию массив и переменной j. Интересно, почему так происходит?
SatanaXIII
Супер-модератор
Эксперт С++
5610 / 2644 / 245
Регистрация: 01.11.2011
Сообщений: 6,506
Завершенные тесты: 1
28.03.2014, 15:09 #8
Maximilan, я ничего не понял.
Попадались мне такие диалекты языка, в которых значение по умолчанию было обязательным для switch. В какой среде вы разрабатываете? Code::Blocks?
Maximilan
2 / 2 / 0
Регистрация: 03.10.2012
Сообщений: 15
28.03.2014, 15:15  [ТС] #9
SatanaXIII, Пользуюсь Visual Studio 12.
default использую для вывода сообщения об ошибке ввода, в случае если вводят что то левое.
Текст ошибок:
пропуск инициализации "st_buf" из-за метки "default"
см. объявление "st_buf"
пропуск инициализации "j" из-за метки "default"
см. объявление "j"
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.03.2014, 15:37 #10
объявление этих переменных вынесите из switch'a
SatanaXIII
Супер-модератор
Эксперт С++
5610 / 2644 / 245
Регистрация: 01.11.2011
Сообщений: 6,506
Завершенные тесты: 1
28.03.2014, 15:45 #11
Maximilan, все из-за того, что компилятор не понимает к чему относится default. В вашем коде он относится к cout, а это соответственно не имеет смысла.
Пользуйтесь логическими скобками:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
switch(some)
{
  case 1:
        {
        } break;
  case 2:
        {
        } break;
  case 3:
        {
        } break;
  default:
        {
        }
}
Maximilan
2 / 2 / 0
Регистрация: 03.10.2012
Сообщений: 15
28.03.2014, 15:50  [ТС] #12
SatanaXIII, Возьму на заметку, спасибо.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2014, 15:50
Привет! Вот еще темы с ответами:

Удаление элементов из стека - C++
Здравствуйте. Посмотрите, пожалуйста мой код. Это не совсем обычная реализация стэка. И может быть не совсем логичная, но она работает, за...

Удаление элементов из стека - C++
Удалить из созданного списка(стек) отрицательные элементы.

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

Редактирование отдельных элементов стека - C++
Полное задание: &quot;Разработать приложение, работающее со стеком, содержащим данные о налогоплательщиках. Элементом стека является структура,...


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

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

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