Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Стек с защитой от ошибок

Реализуйте структуру данных «стек». Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:

push 𝑛 — добавить в стек число 𝑛 (значение 𝑛 задаётся после команды). Программа должна вывести ok.
pop — удалить из стека последний элемент. Программа должна вывести его значение.
back — программа должна вывести значение последнего элемента, не удаляя его из стека.
size — программа должна вывести количество элементов в стеке.
clear — программа должна очистить стек и вывести ok.
exit — программа должна вывести bye и завершить работу.
Перед исполнением операций back и pop программа должна проверять, содержится ли в стеке хотя бы один элемент. Если во входных данных встречается операция back или pop и при этом стек пуст, то программа должна вместо числового значения вывести строку error.

Входные данные

Вводятся команды управления стеком, каждая в отдельной строке. Среди них обязательно присутствует команда exit.

Выходные данные

Программа должна вывести протокол работы стека, по одному сообщению в строке.

Примеры

Ввод
Вывод
size
push 1
size
push 2
size
push 3
size
exit
0
ok
1
ok
2
ok
3
bye

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
 #include <iostream>  
#include <string>  
#include <vector>  
using namespace std;  
  
vector <int> stack;  
  
void push(int elem) {  
    stack.push_back(elem);  
}  
  
int pop() {  
    int last = stack.back();  
    stack.pop_back();  
    return last;  
}  
  
int back() {  
    return stack.back();  
}  
  
int size() {  
    return stack.size();  
}  
   
void clear() {  
    for (int i = 0; i < stack.size(); ++i) stack.pop_back();  
}  
  
int main()  
{  
    bool run = true;  
    while (run)  
    {  
        string comand;  
        cin >> comand;  
        if (comand.substr(0, 4) == "push")  
        {  
            int push_com = static_cast<int>(comand[comand.size() - 1]);  
            push(push_com);  
            cout << "ok" << endl;  
        }  
        else if (comand == "pop")  
        {  
            if (stack.size() > 0) pop();  
            else cout << "error" << endl;  
        }  
        else if (comand == "back")  
        {  
            if (stack.size() > 0) cout << back() << endl;  
            else cout << "error" << endl;  
        }  
        else if (comand == "size") cout << size() << endl;  
        else if (comand == "clear")  
        {  
            clear();  
            cout << "ok" << endl;  
        }  
        else if (comand == "exit")  
        {  
            cout << "bye" << endl;  
            run = false;  
        }  
    }  
  
    return 0;  
}  

Код проваливает второй тест. Помогите, пожалуйста, найти ошибки и исправить код!

По дате
По рейтингу
Аватар пользователя
Новичок
11мес
  1. static_cast НЕ преобразует символ '0' в число 0, а символ '9' в число 9.

  2. У тебя в задаче ЧИСЛО n, а не "цифра n". Целое число состоит из возможного знака числа и не менее одной цифры. Преобразование в число единственного символа строки заведомо ошибочно.

  3. При выполнении команды pop ты НЕ выводишь удалённое из стека значение.

  4. Для удаления всех элементов vector цикл НЕ нужен: stack.clear().

Аватар пользователя
Высший разум
11мес
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
 #include <iostream> 
#include <string>

using namespace std;

template<typename T> 
class Stack { 
public: 
    Stack() : count(0), buffer(0), stack(nullptr) {} 
    ~Stack() { 
        if (stack != nullptr) { 
            delete[] stack; 
            stack = nullptr; 
        } 
    } 
    bool push(const T& value) { 
        if (stack == nullptr) { 
            buffer = length; 
            stack = new(nothrow) T[buffer]; 
            if (stack != nullptr) stack[0] = value; 
            ++count; 
        } else if (count == buffer) { 
            auto tmp = new(nothrow) T[buffer + length]; 
            if (tmp != nullptr) { 
                buffer += length; 
                copy(stack, stack + count, tmp); 
                delete[] stack; 
                stack = forward<T*>(tmp); 
                stack[count] = value; 
                ++count; 
            } 
        } else { 
            stack[count] = value; 
            ++count; 
        } 
        return stack != nullptr; 
    } 
    void pop() { 
        if (count != 0) --count; 
    } 
    T& back() { 
        return stack[count - 1]; 
    } 
    const T& back() const { 
        return stack[count - 1]; 
    } 
    size_t size() const { 
        return count; 
    } 
    bool clear() { 
        if (stack != nullptr) count = 0; 
        return true; 
    } 
private: 
    static constexpr size_t length = 8; 
    size_t count; 
    size_t buffer; 
    T* stack; 
}; 
 
int main() { 
    Stack<int> stack; 
    string command; 
    int value{}; 
    do { 
        cin >> command; 
        if (command == "push") { 
            cin >> value; 
            if (stack.push(value)) cout << "ok\n"; 
        } 
        else if (command == "pop") stack.pop(); 
        else if (command == "size") cout << stack.size() << '\n'; 
        else if (command == "back") cout << stack.back() << '\n'; 
        else if (command == "clear") { 
            if (stack.clear()) cout << "ok\n"; 
        } 
    } while (command != "exit"); 
    puts("bye"); 
} 
Аватар пользователя
Гений
11мес

cin >> command;
В строку command попадает только одно слово а не строка, поэтому не нужно писать substr() и т.д.
if (command == "push") {int num; cin >> num; push(num);} //число num считается как нужно
if (command == "pop") cout << pop() << endl; //нужно же выводить число
И вообще если к задаче нет пометки "нельзя использовать стандартные контейнеры" то вместо вектора можно всунуть stack и не париться)

Аватар пользователя
Оракул
11мес

Стек тут при чём? А, команда так называется... Прикольно. Не запутаешься. Смеюсь