Задача
Стек с защитой от ошибок
Реализуйте структуру данных «стек«. Напишите программу, содержащую описание стека и моделирующую работу стека, реализовав все указанные здесь методы. Программа считывает последовательность команд и в зависимости от команды выполняет ту или иную операцию. После выполнения каждой команды программа должна вывести одну строчку. Возможные команды для программы:
push n
Добавить в стек число n (значение n задается после команды). Программа должна вывести ok.
pop
Удалить из стека последний элемент. Программа должна вывести его значение.
back
Программа должна вывести значение последнего элемента, не удаляя его из стека.
size
Программа должна вывести количество элементов в стеке.
clear
Программа должна очистить стек и вывести ok.
exit
Программа должна вывести bye и завершить работу.
Входные данные
Команды для стека.
Выходные данные
Соответствующие значения для каждой команды(см. выше).
Тесты
№ | Последовательность | Результат |
1 | push 2 back pop size pop push 1 size exit |
ok 2 2 0 error ok 1 bye |
2 | push 3 push 1 push 5 size pop size exit |
ok ok ok 3 5 2 bye |
3 | back push 9 pop pop exit |
error ok 9 error bye |
4 | size push 1 size back pop exit |
0 ok 1 1 1 bye |
Код
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 |
#include <iostream> using namespace std; struct stack { //создаем структуру long long s[100]; int cursor=0; //указатель void push(long long n){ //задаем функцию для каждой из команд: push n, pop, back, size, clear s[cursor++]=n; } long long pop(){ return s[--cursor]; } long long back(){ return s[cursor-1]; } unsigned size(){ return cursor; } void clear(){ cursor=0; s[cursor]=0; } }; int main() { stack x; string b; //задаем строку long long n; while(cin>>b){ //читаем ее if(b=="push"){ //выполняем команды, которые встречаем в строке cin>>n; x.push(n); cout<<"ok"<<endl; } else if(b=="pop"){ if(x.size()==0){ cout<<"error"<<endl; } else cout<<x.pop()<<endl; } else if(b=="back"){ if(x.size()==0){ cout<<"error"<<endl; } else cout<<x.back()<<endl; } else if(b=="size"){ cout<<x.size()<<endl; } else if(b=="clear"){ x.clear(); cout<<"ok"<<endl; } else if(b=="exit"){ cout<<"bye"<<endl; break; } } return 0; } |
Решение
Создаем структуру в которой реализуем все команды для стека с помощью функций и указателя([latex]cursor[/latex]). [latex]cursor[/latex] указывает на последний элемент в строке. Изначально [latex]cursor[/latex] равен 0, т.к. сначала стек пуст.
[latex]push n[/latex] записывает в ячейку с номером [latex]cursor+1[/latex] элемент [latex]n[/latex]. [latex]size[/latex] возвращает [latex]cursor[/latex] т.е. размер стека. [latex]pop[/latex] возвращает последний помещённый в стек элемент, то есть элемент с номером [latex]cursor-1[/latex], при этом удаляя его из стека. Если размер стека равен 0 то функция возвращает [latex]error[/latex]. [latex]back[/latex] возвращает последний помещённый в стек элемент, то есть элемент с номером [latex]cursor-1[/latex]. Если размер стека равен 0 то функция возвращает [latex]error[/latex]. [latex]clear[/latex] присваивает [latex]cursor[/latex] значение 0. [latex]exit[/latex] выполняется с помощью оператора [latex]break[/latex], который заканчивает выполнение цикла, в который вводятся команды.
Ссылка на e-olymp.
Ссылка на ideone.
Плохо. Ссылка на e-olymp не работает, пояснений практически нет.
Спасибо, я исправил.