实现一个具有能返回栈中最小元素的操作的特殊栈;时间O(1),空间O(n)
思想:使用两个栈,
一个栈用来保存当前栈中的元素(就是一个正常的栈)记为:dataStack;
一个用于保存每一步的最小值,记为:minStack;数据压入规则:
正常压入stackData中;
stackMin为空,直接压入;非空,同stackMin栈顶比较,小于则压入;否则不需要压入;数据弹出规则:
弹出stackData栈顶元素value
将value同stackMin中的栈顶比较,若等于,则stackMin也要弹出栈顶元素;否则不需要弹出;
得到整个栈结构的最小值:
取stackMin的栈顶元素值;
/**
* @Description https://www.nowcoder.com/practice/05e57ce2cd8e4a1eae8c3b0a7e9886be?tpId=101&tqId=33073&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-interview-guide/question-ranking
* 题目:实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
* <p>
* 时间复杂度: O(1)
* 空间复杂度:O(n)
* @author: Golden
* @date: 2020/3/23
*/
public class GetMinStack {
private Stack<Integer> dataStack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();
//入栈
public Integer push(Integer item) {
dataStack.push(item);
if (minStack.empty()) {
minStack.push(item);
} else {
Integer top = minStack.peek();
if (top > item) {
//总是存储最小值
minStack.push(item);
}
}
return item;
}
//出栈
public Integer pop() {
Integer item = dataStack.pop();
if (!minStack.isEmpty()) {
Integer top = minStack.peek();
if (item.equals(top)) {
minStack.pop();
}
}
return item;
}
//取栈顶
public Integer peek() {
return dataStack.peek();
}
//获取最小值
public Integer getMin() {
return minStack.isEmpty() ? null : minStack.peek();
}
@Test
public void testDemo() {
GetMinStack stack = new GetMinStack();
stack.push(3);
stack.push(2);
stack.push(1);
System.out.println(stack.getMin());
stack.pop();
System.out.println(stack.getMin());
}
public static void main(String[] args) throws IOException {
GetMinStack stack = new GetMinStack();
BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
int row = Integer.parseInt(sc.readLine());
for (int i = 0; i < row; i++) {
String[] str = sc.readLine().split(" ");
if ("push".equals(str[0])) {
stack.push(Integer.valueOf(str[1]));
continue;
}
if ("pop".equals(str[0])) {
stack.pop();
continue;
}
System.out.println(stack.getMin());
}
}
}

京公网安备 11010502036488号