Ввод элементов стека через консоль

201
21 марта 2018, 05:26

Как реализовать ввод элементов стека не статичными данными, а с помощью ввода через консоль? Ну, т.е. через диалоговое окно например: "Введите стек:".

#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;
}
Answer 1

Самый простой способ - просто в цикле вызывать 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&)>> по принципу "извлекаем команду - ищем в карте функцию, соответствующую команде - вызываем функцию, передавая ей аргументы этой команды (остаток строки)".

Answer 2

У вас массив неинициализирован изначально, а первый элемент массива занимает память и никогда не используется, и когда используете массив, всегда нужно обработать выход за пределы: По этим причинам я немного переделал ваш код и добавил то, что вас интересует

#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;
}
READ ALSO
Как перенести не вмещающийся текст

Как перенести не вмещающийся текст

Как перенести на новую строчку текст, который выходит за пределы нужной области? Или не больше 35 символов в строчке, если больше то на новую...

262
NoSuchMethodError в gradle проекте

NoSuchMethodError в gradle проекте

При выполнении следующего кода возникает ошибка javalang

197
Сдвиг по временной зоне (TimeZone)

Сдвиг по временной зоне (TimeZone)

Стала задача установить дату, переданную клиентом, в его временную зонуС помощью TimeZone

199
Callback в Activity

Callback в Activity

Доброго времени суток!

168