Question: Sort a stack in increasing order. Two ways: sort it recursively and use an explicit stack.
// solve it recursively
void insertToStack(stack<int>& s, int value) {
if(s.empty() || s.top() <= value) {
s.push(value);
return;
} else {
int tmp = s.top();
s.pop();
insertToStack(s, value);
s.push(tmp);
}
return;
}
void sortStack(stack<int>& s) {
if(s.empty()) return;
else {
int value = s.top();
s.pop();
sortStack(s);
insertToStack(s, value);
}
return;
}
// if we can explicitly use a second stack, it is easier.
void sortStackII(stack<int>& s) {
stack<int> tmp;
int size = s.size();
for(int i = 0; i < s.size(); ++i) {
int currMin = INT_MAX;
while(s.size() != i) {
int value = s.top();
s.pop();
tmp.push(value);
currMin = min(currMin, value);
}
s.push(currMin);
while(!tmp.empty()) {
int value = tmp.top();
if(value == currMin) {
currMin = INT_MAX;
} else {
s.push(value);
}
tmp.pop();
}
}
return;
}
int main(void) {
stack<int> s;
s.push(2);
s.push(1);
s.push(1);
s.push(3);
sortStackII(s);
while(!s.empty()) {
cout << s.top() << endl;
s.pop();
}
}