題目描述
一個棧一次壓入了1、2、3、4、5,那麼從棧頂到棧底分別爲5、4、3、2、1.將這個棧轉置後,從棧頂到棧底爲1、2、3、4、5,
解題思路
空間複雜度爲O(n)
生成一個輔助棧,依次從原來棧中彈出壓入輔助棧中,返回最後結果。
遞歸方法
不利用輔助棧,遞歸調用取得棧底元素的子函數然後將其壓入原有棧中。空間複雜度爲O(1),時間複雜度爲O(n)
程序實現
public class Solution {
/**
* 逆置一個棧,O(n)時間,O(n)空間
*
* @param stack
* @return
*/
public Stack<Integer> reverseStack(Stack<Integer> stack) {
Stack<Integer> res = new Stack<>();
if (stack == null || stack.isEmpty())
return res;
while (!stack.isEmpty()) {
res.add(stack.pop());
}
return res;
}
/**
* 逆置一個棧,O(n)時間,O(1)空間
*
* @param stack
* @return
*/
public Stack<Integer> reverseStack1(Stack<Integer> stack) {
if (stack == null || stack.isEmpty())
return stack;
int i = getAndRemoveBottomElement(stack);
reverseStack1(stack);
stack.push(i);
return stack;
}
/**
* 取得棧底元素
*
* @param stack
* @return
*/
private int getAndRemoveBottomElement(Stack<Integer> stack) {
int result = stack.pop();
if (stack.isEmpty())
return result;
int last = getAndRemoveBottomElement(stack);
stack.push(result);
return last;
}
public static void main(String[] args) {
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
System.out.println(stack);
System.out.println(new Solution().reverseStack1(stack));
}
}