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

          import java.util.ArrayList;

          /**
           * 實現(xiàn)包含min函數(shù)的棧
           * @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) {
                  // 這兒不同的泛型類型可以用不同的方式實現(xiàn)
                  // 如果寫成通用代碼泛型之間應該腫么比較大小呢?是不是可以讓泛型都繼承某一接口呢?
                  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)  編輯  收藏

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


          網(wǎng)站導航:
           
          人人游戲網(wǎng) 軟件開發(fā)網(wǎng) 貨運專家
          主站蜘蛛池模板: 滁州市| 芷江| 崇左市| 尤溪县| 太谷县| 祁门县| 涿鹿县| 安国市| 玉田县| 大兴区| 久治县| 秭归县| 沈阳市| 香格里拉县| 寻甸| 海南省| 黄浦区| 镶黄旗| 伊川县| 连城县| 玛纳斯县| 清远市| 家居| 华安县| 视频| 专栏| 西乌珠穆沁旗| 叙永县| 海兴县| 庆安县| 蓬莱市| 涪陵区| 美姑县| 和田市| 太白县| 沐川县| 丰顺县| 凤台县| 巴林左旗| 高阳县| 勐海县|