一. 題目
定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min 函數.在該棧中,調用min,push 及pop的時間複雜度都是O(1).
代碼請到我的代碼庫中下載 Point2Offer
二. 代碼
package week_5;
import java.util.Stack;
/**難度係數:***
* 劍指offer: 包含min函數的棧
* 方法: 建一個輔助棧,存最小值
* 測試用例:
* @author dingding
* Date:2017-7-11 21:40
* Declaration: All Rights Reserved!
*/
public class No21 {
public static void main(String[] args) {
test1();
test2();
test3();
test4();
}
//定義新棧
public static class CStack{
private Stack<Integer> stack_data = new Stack<>();
private Stack<Integer> stack_min = new Stack<>();
private void push(Integer number){
stack_data.add(number);
if (stack_min.isEmpty() || number<stack_min.peek()) {
stack_min.add(number);
}else {
stack_min.add(stack_min.peek());
}
}
private int pop(){
if (stack_data.isEmpty() && stack_min.isEmpty()) {
throw new RuntimeException("The stack is already empty");
}
stack_min.pop();
return stack_data.pop();
}
private int min(){
if (!stack_data.isEmpty() && !stack_min.isEmpty()) {
return stack_min.peek();
}else {
throw new RuntimeException("No more element.");
}
}
}
/*===================測試用例=============*/
//入棧比前一個大的數
private static void test4() {
CStack cStack = new CStack();
cStack.push(3);
cStack.push(4);
int result = cStack.min();
System.out.println(result);
System.out.println();
}
//入棧比前一個小的數
private static void test3() {
CStack cStack = new CStack();
cStack.push(3);
cStack.push(4);
cStack.push(2);
int result = cStack.min();
System.out.println(result);
System.out.println();
}
//彈出棧不是最小的數
private static void test2() {
CStack cStack = new CStack();
cStack.push(1);
cStack.push(3);
cStack.push(4);
cStack.pop();
int result = cStack.min();
System.out.println(result);
System.out.println();
}
//彈出棧是最小的數
private static void test1() {
CStack cStack = new CStack();
cStack.push(3);
cStack.push(4);
cStack.push(2);
cStack.push(1);
cStack.pop();
int result = cStack.min();
System.out.println(result);
System.out.println();
}
}
有不妥當之處,麻煩告知:D