Stacks and Queues
Queue from Two Stacks
Implement queue behavior with an input stack and an output stack.
Algorithm
The replay uses the same three values in every language, so this C++ DSA implementation can be compared directly with the rest of the DSA track.
input stack
Enqueue pushes new values onto the input stack.
output stack
When the output stack is empty, transferring all input values reverses them into dequeue order.
Visual walkthrough
Basic Implementation
basic.cpp
#include <deque>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
string render(const vector<int>& values) {
ostringstream out;
for (size_t i = 0; i < values.size(); ++i) {
if (i > 0) out << " -> ";
out << values[i];
}
return out.str();
}
int main() {
vector<int> inStack;
vector<int> outStack;
for (int value : {10, 20, 30}) inStack.push_back(value);
while (!inStack.empty()) {
outStack.push_back(inStack.back());
inStack.pop_back();
}
vector<int> removed;
while (!outStack.empty()) {
removed.push_back(outStack.back());
outStack.pop_back();
}
cout << render(removed) << endl;
}
Complexity
- Time: O(1) amortized per operation
- Space: O(n)
Implementation notes
- In C++, the checked source uses two
std::vector<int>instances,inStackandoutStack, as stack backs; it does not use thestd::stackadapter. - Enqueue is
inStack.push_back(value)over{10, 20, 30}. Stack top is the vector back, so reads useback()and removals usepop_back(). - Transfer runs while
!inStack.empty(), copyinginStack.back()intooutStack.push_back(...)before popping frominStack. This reverses[10, 20, 30]into out stack[30, 20, 10]. - Dequeue drains
outStackunderwhile (!outStack.empty()), copyingoutStack.back()intoremovedbeforepop_back(). The values areintcopies, not moved-owned objects. - The trace records empty stacks, input
[10, 20, 30], transfer to output[30, 20, 10], then removed[10, 20, 30]with output empty. render(const std::vector<int>&)usesstd::ostringstreamand asize_tloop to produce10 -> 20 -> 30, which is printed withstd::cout.- Visible allocation is the three vectors and output string buffer; mutation
happens through vector
push_backandpop_back.