std::stack<T,Container>::push
void push( const value_type& value ); | (1) | |
void push( value_type&& value ); | (2) | (начиная с C++11) |
Помещает заданный элемент value на вершину стека.
1) Эквивалентно:
c.push_back(value).
2) Эквивалентно:
c.push_back(std::move(value)).Параметры
| value | - | значение добавляемого элемента |
Сложность
Равна сложности Container::push_back.
Пример
Эта программа реализует BrainHack — предметно-ориентированный язык, в котором использование std::stack является идиоматичным способом обработки парных скобок.
#include <array>
#include <cstdint>
#include <iostream>
#include <map>
#include <stack>
#include <stdexcept>
#include <string_view>
class BrainHackInterpreter
{
std::map<unsigned, unsigned> open_brackets, close_brackets;
std::array<std::uint8_t, 32768> data_{0};
unsigned program_{0};
int pos_{0};
void collect_brackets(const std::string_view program)
{
std::stack<unsigned> brackets_stack;
for (auto pos{0U}; pos != program.length(); ++pos)
{
if (const char c{program[pos]}; '[' == c)
brackets_stack.push(pos);
else if (']' == c)
{
if (brackets_stack.empty())
throw std::runtime_error("Brackets [] do not match!");
else
{
open_brackets[brackets_stack.top()] = pos;
close_brackets[pos] = brackets_stack.top();
brackets_stack.pop();
}
}
}
if (!brackets_stack.empty())
throw std::runtime_error("Brackets [] do not match!");
}
void check_data_pos(int pos)
{
if (pos < 0 or static_cast<int>(data_.size()) <= pos)
throw std::out_of_range{"Data pointer out of bound!"};
}
public:
BrainHackInterpreter(const std::string_view program)
{
for (collect_brackets(program); program_ < program.length(); ++program_)
switch (program[program_])
{
case '<':
check_data_pos(--pos_);
break;
case '>':
check_data_pos(++pos_);
break;
case '-':
--data_[pos_];
break;
case '+':
++data_[pos_];
break;
case '.':
std::cout << data_[pos_];
break;
case ',':
std::cin >> data_[pos_];
break;
case '[':
if (data_[pos_] == 0)
program_ = open_brackets[program_];
break;
case ']':
if (data_[pos_] != 0)
program_ = close_brackets[program_];
break;
}
}
};
int main()
{
BrainHackInterpreter
{
"++++++++[>++>>++>++++>++++<<<<<-]>[<+++>>+++<-]>[<+"
"+>>>+<<-]<[>+>+<<-]>>>--------.<<+++++++++.<<----.>"
">>>>.<<<------.>..++.<++.+.-.>.<.>----.<--.++.>>>+."
};
std::cout << '\n';
}
Вывод:
Hi, cppreference!
См. также
|
(C++11) | создаёт элемент непосредственно на вершине (открытая функция-член) |
| удаляет верхний элемент (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/stack/push