std::stack<T,Container>::push
De cppreference.com
<tbody>
</tbody>
void push( const value_type& value ); |
||
void push( value_type&& value ); |
(desde C++11) | |
Apila el elemento dado value en la parte superior de la pila.
1) Efectivamente llama a
c.push_back(value)2) Efectivamente llama a
c.push_back(std::move(value))Parámetros
| value | - | El valor del elemento a apilar. |
Valor de retorno
(Ninguno)
Complejidad
Igual a la complejidad de Container::push_back.
Ejemplo
Este programa implementa el famoso lenguaje específico de dominio BrainHack, cuando std::stack es especialmente conveniente para colectar corchetes emparejados.
Ejecuta este código
#include <map>
#include <stack>
#include <array>
#include <iostream>
#include <stdexcept>
#include <string_view>
class BrainHackInterpreter {
std::map<unsigned, unsigned> open_brackets, close_brackets;
unsigned program_pos_{0};
std::array<std::uint8_t, 32768> data_;
int data_pos_{0};
void collect_brackets_positions(const std::string_view program) {
std::stack<unsigned> brackets_stack;
for (auto pos{0U}; pos != program.length(); ++pos) {
const char c{program[pos]};
if ('[' == c) {
brackets_stack.push(pos);
} else if (']' == c) {
if (brackets_stack.empty()) {
throw std::runtime_error("los corchetes [] no coinciden");
} else {
open_brackets[brackets_stack.top()] = pos;
close_brackets[pos] = brackets_stack.top();
brackets_stack.pop();
}
}
}
if (!brackets_stack.empty())
throw std::runtime_error("los corchetes [] no coinciden");
}
void check_data_pos(int pos) {
if (pos < 0 or pos >= static_cast<int>(data_.size()))
throw std::out_of_range{"puntero a datos fuera de límite"};
}
public:
BrainHackInterpreter(const std::string_view program) {
collect_brackets_positions(program);
data_.fill(0);
for (; program_pos_ < program.length(); ++program_pos_) {
switch (program[program_pos_]) {
case '<': check_data_pos(--data_pos_); break;
case '>': check_data_pos(++data_pos_); break;
case '-': --data_[data_pos_]; break;
case '+': ++data_[data_pos_]; break;
case '.': std::cout << data_[data_pos_]; break;
case ',': std::cin >> data_[data_pos_]; break;
case '[':
if (data_[data_pos_] == 0)
program_pos_ = open_brackets[program_pos_];
break;
case ']':
if (data_[data_pos_] != 0)
program_pos_ = close_brackets[program_pos_];
break;
}
}
}
};
int main()
{
BrainHackInterpreter
{
"++++++++[>++>>++>++++>++++<<<<<-]>[<+++>>+++<-]>[<+"
"+>>>+<<-]<[>+>+<<-]>>>--------.<<+++++++++.<<----.>"
">>>>.<<<------.>..++.<++.+.-.>.<.>----.<--.++.>>>+."
};
}
Salida:
Hi, cppreference!
Véase también
(C++11) |
Apila el elemento en el sitio en la parte superior de la pila. (función miembro pública) |
| Desapila el elemento en la parte superior de la pila. (función miembro pública) |