Как реализовать ввод элементов стека не статичными данными, а с помощью ввода через консоль? Ну, т.е. через диалоговое окно например: "Введите стек:".
#include <iostream>
using namespace std;
class Stack // класс стек
{
private:
static const int MAX = 10; // размер
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(11);
s1.push(22);
s1.push(33);
s1.push(44);
s1.push(55);
s1.push(66);
cout << s1.pop() << endl;
cout << s1.pop() << endl;
cout << s1.pop() << endl;
cout << s1.pop() << endl;
cout << s1.pop() << endl;
cout << s1.pop() << endl;
}
Самый простой способ - просто в цикле вызывать std::cin >> value
, до тех пор, пока не будет введён недопускимый символ (возможно, имеет смысл считывать строки, а уже их парсить в int - иначе сложно сделать условие выхода из цикла).
Тут недавно было несколько вопросов на тему стека, там были примеры реализации меню. На мой взгляд - это не лучший вариант, но рабочий.
Другой вариант - реализовать командный режим работы. Что-то вроде
create "stack1"
add "stack1" 3
create "stack2"
add "stack2" 8
add "stack2" 15
print "stack2"
pop "stack2"
print "stack2"
Сами стеки можно хранить в std::map
с именем в качестве ключа. Команды проще всего читать построчно, т.е. std:cin.getline()
, команды можно парсить либо обычными вложенными if-фами, либо использовать std::map<std::function<void(const std::string&)>>
по принципу "извлекаем команду - ищем в карте функцию, соответствующую команде - вызываем функцию, передавая ей аргументы этой команды (остаток строки)".
У вас массив неинициализирован изначально, а первый элемент массива занимает память и никогда не используется, и когда используете массив, всегда нужно обработать выход за пределы: По этим причинам я немного переделал ваш код и добавил то, что вас интересует
#include <iostream>
using namespace std;
class Stack // класс стек
{
private:
static const int MAX = 100; // размер
int st[MAX];
int top;
public:
Stack() : top(0)
{
for(int i = 0; i < MAX; ++i) // инициализирум массив
st[i] = 0;
}
void push(int var) // функция вставки
{
if (top < MAX)
st[top++] = var;
else
std::cerr << " error: Stack is full! ";
}
int pop()
{
if (top)
return st[--top];
else {
std::cerr << " error: Stack is empty! ";
return 0;
}
}
bool isFull() const { return top == MAX;} // Stack overflow?
size_t size() const { return top; } // количество введенных элементов
friend istream& operator >>(istream& is, Stack& s)
{
int k = 0;
while (is >> k && !(s.isFull())) { // вводим из cin пока стэк не полон
s.push(k);
}
return is;
}
friend ostream& operator <<(ostream& os, const Stack& s)
{
int k = s.top;
if (k) // если стэк не пустой выводим все вводимые начиная с последнего
for (int i = k - 1; i >= 0; --i)
os << s.st[i] << ' ';
else
os << "error: Stack is empty!";
return os;
}
};
теперь можно спокойно работать со стэком, а также осуществить ввод и вывод через консоль (как вы сказали)
int main()
{
Stack s;
cin >> s;
cout << s;
return 0;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как перенести на новую строчку текст, который выходит за пределы нужной области? Или не больше 35 символов в строчке, если больше то на новую...
Стала задача установить дату, переданную клиентом, в его временную зонуС помощью TimeZone