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 墻頭草 閱讀(1056) 評論(0)  編輯  收藏

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


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 通道| 原阳县| 宣威市| 永泰县| 山阳县| 永新县| 黑山县| 监利县| 余姚市| 宁城县| 同心县| 资阳市| 友谊县| 行唐县| 汕头市| 洞口县| 永清县| 仁化县| 成安县| 会昌县| 和政县| 阜平县| 中江县| 古交市| 定远县| 千阳县| 阿勒泰市| 长岛县| 广安市| 剑阁县| 年辖:市辖区| 贵州省| 宜兰县| 车致| 元朗区| 酉阳| 黔西县| 天柱县| 庆云县| 阜南县| 恭城|