posts - 241,  comments - 116,  trackbacks - 0
          題目:定義棧的數據結構,要求添加一個min函數,能夠得到棧的最小元素。要求函數min、push以及pop的時間復雜度都是O(1)。 實現思路:們需要一個輔助棧。每次push一個新元素的時候,同時將最小元素(或最小元素的位置。考慮到棧元素的類型可能是復雜的數據結構,用最小元素的位置將能減少空間消耗)push到輔助棧中;每次pop一個元素出棧的時候,同時pop輔助棧。
          package stack;

          import java.util.ArrayList;

          /**
           * 實現包含min函數的棧
           * @author DHC
           * @param <T>
           */
          public class MinInStack<T> {

              public static void main(String[] args) {
                  MinInStack<Integer> newStack = new MinInStack<Integer>();
                  newStack.push(4);
                  newStack.push(6);
                  newStack.push(2);
                  newStack.push(5);
                  newStack.pop();
                  newStack.pop();
                  newStack.push(1);
                  System.out.println(newStack.min());
              }
              
              public ArrayList<T> stack = new ArrayList<T>();
              
              public ArrayList<Integer> minStack = new ArrayList<Integer>();
              
              public T pop() {
                  int size = stack.size();
                  minStack.remove(size - 1);
                  return stack.remove(size - 1);
              }
              
              public void push(T item) {
                  int size = stack.size();
                  
                  if (size == 0) {
                      minStack.add(0);
                  } else {
                      int minPosition = minStack.get(size - 1);
                      T minData = stack.get(minPosition);
                      
                      if (compare(minData, item)) {
                          minStack.add(stack.size());
                      } else {
                          minStack.add(minPosition);
                      }
                  }
                  
                  stack.add(item);
              }
              
              public T peek() {
                  int size = stack.size();
                  return stack.get(size - 1);
              }
              
              public T min() {
                  int size = minStack.size();
                  return stack.get(minStack.get(size - 1));
              }
              
              public boolean isEmpty() {
                  return stack.isEmpty();
              }

              /**
               * 泛型元素的比較方法
               * @param minData
               * @param item
               * @return true 代表當前元素小于之前的最小元素
               */
              private boolean compare(T minData, T item) {
                  // 這兒不同的泛型類型可以用不同的方式實現
                  // 如果寫成通用代碼泛型之間應該腫么比較大小呢?是不是可以讓泛型都繼承某一接口呢?
                  int a = (Integer) minData;
                  int b = (Integer) item;
                  if(a > b) {
                      return true;
                  } else {
                      return false;
                  }
              }
          }
          posted on 2012-01-31 15:57 墻頭草 閱讀(1059) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 内黄县| 监利县| 台州市| 萨迦县| 云安县| 文昌市| 阿克苏市| 西安市| 罗城| 天津市| 无极县| 双城市| 寻乌县| 商水县| 苍南县| 五大连池市| 班玛县| 无为县| 辽源市| 朔州市| 白山市| 紫阳县| 茌平县| 高唐县| 红桥区| 韶关市| 满洲里市| 武功县| 青阳县| 新昌县| 高要市| 三江| 金门县| 通城县| 鸡东县| 靖江市| 浦北县| 永德县| 开远市| 合山市| 阳春市|