「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」
描述
栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。
- 示例 1:
输入:
["SortedStack", "push", "push", "peek", "pop", "peek"]
[[], [1], [2], [], [], []]
输出:
[null,null,null,1,null,2]
- 示例 2:
输入:
["SortedStack", "pop", "pop", "push", "pop", "isEmpty"]
[[], [], [], [1], [], []]
输出:
[null,null,null,null,null,true]
- 提示:
- 栈中的元素数目在[0, 5000]范围内。
解析
题目的意思是用栈来做,而且最多只能用一个辅助栈来完成对栈的排序,所以根据题目的意思应该使用两个栈来解题, 思想和单调栈的思想差不多,当入栈的元素val大于栈顶时用辅助栈来保存弹出的数据,当栈顶元素大于等于val时入栈,然后将help栈的元素圧回data栈。
具体步骤可分为以下几步:
-
如果数据栈不为空,且本次push值大于栈顶的值,则将数据栈顶弹出,然后压入辅助栈,直到数据栈为空或者push值不大于栈顶值,退出循环。
-
将本次push值压入数据栈。
-
将临时栈里面的数据压入数据栈。
- pop:当数据栈不为空,执行pop
- peek:当数据栈为空,返回-1,否者数据栈执行peek
- isEmpty:执行数据栈的empty()
class SortedStack {
Stack<Integer> stack = new Stack<>();
Stack<Integer> temp = new Stack<>();
public SortedStack() {
}
public void push(int val) {
while(!stack.empty() && val > stack.peek()){
temp.push(stack.pop());
}
stack.push(val);
while(!temp.empty()){
stack.push(temp.pop());
}
}
public void pop() {
if(stack.empty()){
return;
}
stack.pop();
}
public int peek() {
if(isEmpty()){
return -1;
}else{
return stack.peek();
}
}
public boolean isEmpty() {
return stack.empty();
}
}
/**
* Your SortedStack object will be instantiated and called as such:
* SortedStack obj = new SortedStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.isEmpty();
*/
运行结果:
执行结果:通过
执行用时:150 ms, 在所有 Java 提交中击败了51.92%的用户
内存消耗:38.6 MB, 在所有 Java 提交中击败了61.26%的用户