問題
スタックデータ構造定義、最小の要素は、スタックに含まmin関数であることができるこのタイプの実装(べき時間複雑性O(1))。
注:スタックが空でない場合、テストがあることを保証するために、スタックポップ()または分()または上部()メソッドを呼び出します。
分析
思考
方法1:@
@、追加のストレージ・スタックの最小値minが、各挿入を定義するときに最小の最小値を維持するために、スタックの必要性を取り除きます
アイデア2
方法2 @:
// 2つのスタック定義
データを格納する://スタックA
//スタックB:存放栈A中当前元素的最小值
スタックAスタックの最上位の要素、それが判断された場合
、スタックAにスタック内//ときにすべての要素を同じことが判定された場合、プッシュ要素は、スタックBの最上位要素よりも小さい場合、要素は、スタックページBにプッシュされます
コード
package DlinkedList;
import ATree.Problem6;
import java.util.ArrayList;
import java.util.Stack;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/3/21 0021 16:09
* 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数
* (时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
*/
public class Problem7 {
//方法1:
//可以定义一个额外的min保存栈中的最小值,但是每次插入,取出栈中最小值的时候都需要维护这个最小值
//方法2:
//可以定义一个两个栈
//栈A:存放数据
//栈B:存放栈A中当前元素的最小值,当栈A中的栈顶元素出栈时,则判断
// 当栈A中有元素进栈的时候,同样判断,若入栈的元素小于栈B的栈顶元素,则将该元素页压入栈B
Stack<Integer> A=new Stack<>();
Stack<Integer> B=new Stack<>();
public void push(int node) {
//若栈为空
if(A.size()==0){
A.push(node);
B.push(node);
}else{
//假如压栈的元素小于栈B顶的元素则页压入到栈B中
A.push(node);
if(node<B.peek()){
B.push(node);
}
}
}
public void pop() {
//假如当前出栈的元素就是最小元素,则页应从栈B中出栈
if(top()==B.peek()){
B.pop();
}
A.pop();
}
//查看栈顶元素
public int top() {
return A.peek();
}
public int min() {
//返回栈B的栈顶元素即可
return B.peek();
}
public static void main(String[] args) {
Problem7 problem7 = new Problem7();
problem7.push(20);
problem7.push(12);
problem7.push(15);
problem7.push(2);
problem7.push(33);
problem7.pop();
problem7.pop();
problem7.pop();
System.out.println(problem7.min());
}
}