How to traverse stack in C++?
It is not possible to directly traverse an std:: stack
as it does not have an end
member and that's how a stack data-structure is supposed to be i.e. only have one pointer. But, still here are two lazy hacks to traverse it:
1) Loop Based:
while(!st.empty()) {
cout << st.top();
st.pop();
}
Problems with the loop-based approach:
- The original stack gets empty.
2) Recursion Based:
template <typename T>
void traverse_stack(stack<T> & st) {
if(st.empty())
return;
T x = st.top();
cout << x << " ";
st.pop();
traverse_stack(st);
st.push(x);
}
Advantages of Recursion based approach:
- Maintains the original stack elements.
Problems with Recursion based approach:
- Maintains an internal stack.
- May fail for large size of the stack.
Is it possible to traverse std::stack in C++?
No. A stack is a data structure you should use when you are interested in placing elements on top and getting elements from the top. If you want an iterable stack, either use a different data structure for a stack role (std::vector
?) or write one yourself.
As you mentioned you need printing for debugging purposes, maybe something like this would work for you:
// Example program
#include <iostream>
#include <string>
#include <stack>
#include <vector>
#include <algorithm>
template <typename T>
void StackDebug(std::stack<T> s)
{
std::vector<T> debugVector = std::vector<T>();
while (!s.empty( ) )
{
T t = s.top( );
debugVector.push_back(t);
s.pop( );
}
// stack, read from top down, is reversed relative to its creation (from bot to top)
std::reverse(debugVector.begin(), debugVector.end());
for(const auto& it : debugVector)
{
std::cout << it << " ";
}
}
int main()
{
std::stack< int > numbers;
numbers.push( 9 );
numbers.push( 11 );
StackDebug(numbers);
}
Output is, as expected, "9 11"