


Стек с защитой от ошибок
Реализуйте структуру данных «стек». Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
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
#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;
}
Код проваливает второй тест. Помогите, пожалуйста, найти ошибки и исправить код!
static_cast НЕ преобразует символ '0' в число 0, а символ '9' в число 9.
У тебя в задаче ЧИСЛО n, а не "цифра n". Целое число состоит из возможного знака числа и не менее одной цифры. Преобразование в число единственного символа строки заведомо ошибочно.
При выполнении команды pop ты НЕ выводишь удалённое из стека значение.
Для удаления всех элементов vector цикл НЕ нужен: stack.clear().
#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");
}
cin >> command;
В строку command попадает только одно слово а не строка, поэтому не нужно писать substr() и т.д.
if (command == "push") {int num; cin >> num; push(num);} //число num считается как нужно
if (command == "pop") cout << pop() << endl; //нужно же выводить число
И вообще если к задаче нет пометки "нельзя использовать стандартные контейнеры" то вместо вектора можно всунуть stack и не париться)
Стек тут при чём? А, команда так называется... Прикольно. Не запутаешься. Смеюсь