Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::stack::push(3)	      C++ Standard Libary	   std::stack::push(3)

NAME
       std::stack::push	- std::stack::push

Synopsis
	  void push( const value_type& value );
	  void push( value_type&& value	);	 (since	C++11)

	  Pushes the given element value to the	top of the stack.

	  1) Effectively calls c.push_back(value).
	  2) Effectively calls c.push_back(std::move(value)).

Parameters
	  value	- the value of the element to push

Return value
	  (none)

Complexity
	  Equal	to the complexity of Container::push_back.

Example
	  This	 program  implements  the  BrainHack  DSL,  when  the  use  of
       std::stack is an
	  idiomatic way	to process paired brackets.

       // Run this code

	#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;
	    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("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 || pos >= static_cast<int>(data_.size()))
		    throw std::out_of_range{"data pointer out of bound"};
	    }

	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
	    {
		"++++++++[>++>>++>++++>++++<<<<<-]>[<+++>>+++<-]>[<+"
		"+>>>+<<-]<[>+>+<<-]>>>--------.<<+++++++++.<<----.>"
		">>>>.<<<------.>..++.<++.+.-.>.<.>----.<--.++.>>>+."
	    };
	    std::cout << '\n';
	}

Output:
	Hi, cppreference!

See also
	  emplace constructs element in-place at the top
	  (C++11) (public member function)
	  pop	  removes the top element
		  (public member function)

http://cppreference.com		  2024.06.10		   std::stack::push(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::stack::push&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help