【算法专题 - 栈】
【题目】
使用一个辅助栈完成原始栈的排序:栈顶到栈底从大到小。
【其他限制】
允许使用一个辅助栈,可以申请变量,但不能使用其他数据结构。
【图示】
【分析】
类似汉诺塔问题,元素需要在原始栈和辅助栈之间来回出栈、入栈。首先将原始栈中元素出栈,然后条件性压入辅助栈,当新出栈元素不满足压入辅助栈条件时,可以考虑将辅助栈中元素出栈,重新压入原始栈,以此完成辅助栈中元素顺序的调换。
【解决方案】
假设待排序栈标价为Stack,辅助栈的标记为SortedStack.首先,Stack栈的栈顶元素(标记为curElement)出栈,然后尝试将其压入SortedStack栈,但需要遵从以下限制:
- SortedStack栈为空,直接压入;
- SortedStack栈非空,且curElement <= SortedStack.peek(),将curELement压入;
- SortedStack栈非空,但curElement > SortedStack.peek(),此时需要持续弹出SortedStack栈的顶元素直至元素curElement <= SortedStack栈最新的顶元素。
本题所示的序列2, 0, 1, 9排序过程如下所示:
- Stack栈前两个元素2, 0出栈并压入SortedStack。
- Stack栈第三个元素1出栈,因其大于SortedStack栈当前栈顶元素0,故需要SortedStack栈元素依次出栈,并压入Stack栈。
- Stack栈新添加元素0出栈并压入SortedStack。
- Stack栈最后一个元素9出栈,其是所有元素中的最大值,故需要SortedStack栈中所有元素出栈并压入Stack栈。
- Stack栈中剩余元素依次出栈并依次压入SortedStack栈。
- 将SortedStack栈中的有序元素依次出栈并依次压入原始栈Stack。
【代码实现】
/*
* DESC:
* Sort a stack only uses another stack, a variable is optionnal.
*/
public void sortStack(Stack<Integer> stack) {
Stack<Integer> sortedStack = new Stack<Integer>();
int curElement = 0;
while (!stack.Isempty()) {
curElement = stack.pop();
while (!sortedStack.IsEMpty() && curElemennt > sortedStack.peek()) {
stack.push(sortedStack.pop());
}
sortedStack.push(curElement);
}
while (!sortedStack.IsEmpty()) {
stack.push(sortedStack.pop());
}
}