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)  編輯  收藏

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


          網站導航:
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 虹口区| 肇东市| 霍林郭勒市| 永兴县| 阳谷县| 博湖县| 泰州市| 象州县| 镇远县| 长武县| 土默特左旗| 凭祥市| 娄底市| 溆浦县| 浮梁县| 青田县| 清徐县| 绥芬河市| 乡宁县| 庄河市| 盐山县| 酒泉市| 新营市| 雷州市| 合肥市| 石阡县| 武胜县| 大安市| 二连浩特市| 新宾| 安乡县| 行唐县| 那坡县| 家居| 桐庐县| 腾冲县| 博湖县| 湟源县| 深州市| 盐山县| 莎车县|