91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中的棧實現方法

發布時間:2021-08-26 21:30:29 來源:億速云 閱讀:149 作者:chen 欄目:編程語言

本篇內容主要講解“Java中的棧實現方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java中的棧實現方法”吧!

棧的實現

棧是一種先進后出的數據結構, 首先定義了棧需要實現的接口:

public interface MyStack<T> {      /**       * 判斷棧是否為空       */     boolean isEmpty();      /**       * 清空棧       */     void clear();      /**       * 棧的長度       */     int length();      /**       * 數據入棧       */     boolean push(T data);      /**       * 數據出棧       */     T pop();  }

棧的數組實現,底層使用數組:

public class MyArrayStack<T> implements MyStack<T> {      private Object[] objs = new Object[16];      private int size = 0;       @Override     public boolean isEmpty() {          return size == 0;      }       @Override     public void clear() {          // 將數組中的數據置為null, 方便GC進行回收          for (int i = 0; i < size; i++) {              objs[size] = null;          }          size = 0;      }       @Override     public int length() {          return size;      }       @Override     public boolean push(T data) {          // 判斷是否需要進行數組擴容          if (size >= objs.length) {              resize();          }          objs[size++] = data;          return true;      }       /**       * 數組擴容       */     private void resize() {          Object[] temp = new Object[objs.length * 3 / 2 + 1];          for (int i = 0; i < size; i++) {              temp[i] = objs[i];              objs[i] = null;          }          objs = temp;      }       @SuppressWarnings("unchecked")      @Override     public T pop() {          if (size == 0) {              return null;          }          return (T) objs[--size];      }       @Override     public String toString() {          StringBuilder sb = new StringBuilder();          sb.append("MyArrayStack: [");          for (int i = 0; i < size; i++) {              sb.append(objs[i].toString());              if (i != size - 1) {                  sb.append(", ");              }          }          sb.append("]");          return sb.toString();      }  }&nbsp;&nbsp;

棧的鏈表實現,底層使用鏈表:

public class MyLinkedStack<T> implements MyStack<T> {      /**       * 棧頂指針       */     private Node top;      /**       * 棧的長度       */     private int size;            public MyLinkedStack() {          top = null;          size = 0;      }            @Override     public boolean isEmpty() {          return size == 0;      }            @Override     public void clear() {          top = null;          size = 0;      }            @Override     public int length() {          return size;      }            @Override     public boolean push(T data) {          Node node = new Node();          node.data = data;          node.pre = top;          // 改變棧頂指針          top = node;          size++;          return true;      }            @Override     public T pop() {          if (top != null) {              Node node = top;              // 改變棧頂指針              top = top.pre;              size--;              return node.data;          }          return null;      }            /**       * 將數據封裝成結點       */     private final class Node {          private Node pre;          private T data;      }  }

兩種實現的比較,主要比較數據入棧和出棧的速度:

@Test public void testSpeed() {      MyStack<Person> stack = new MyArrayStack<Person>();      int num = 10000000;      long start = System.currentTimeMillis();      for (int i = 0; i < num; i++) {          stack.push(new Person("xing", 25));      }      long temp = System.currentTimeMillis();      System.out.println("push time: " + (temp - start));      while (stack.pop() != null)          ;      System.out.println("pop time: " + (System.currentTimeMillis() - temp));  }

MyArrayStack中入棧和出棧10,000,000條數據的時間:

push time:936

pop time:47

將MyArrayStack改為MyLinkedStack后入棧和出棧的時間:

push time:936

pop time:126

可見兩者的入棧速度差不多,出棧速度MyArrayStack則有明顯的優勢。

為什么測試結果是這樣的?可能有些朋友的想法是數組實現的棧應該具有更快的遍歷速度,但增刪速度應該比不上鏈表實現的棧才對。但是棧中數據的增刪具有特殊性:只在棧頂入棧和出棧。也就是說數組實現的棧在增加和刪除元素時并不需要移動大量的元素,只是在數組擴容時需要進行復制。而鏈表實現的棧入棧和出棧時都需要將數據包裝成Node或者從Node中取出數據,還需要維護棧頂指針和前驅指針。

棧的應用舉例

1. 將10進制正整數num轉換為n進制

private String conversion(int num, int n) {      MyStack<Integer> myStack = new MyArrayStack<Integer>();      Integer result = num;      while (true) {          // 將余數入棧          myStack.push(result % n);          result = result / n;          if (result == 0) {              break;          }      }      StringBuilder sb = new StringBuilder();      // 按出棧的順序倒序排列即可      while ((result = myStack.pop()) != null) {          sb.append(result);      }      return sb.toString();  }

2. 檢驗符號是否匹配. '['和']', '('和')'成對出現時字符串合法. 例如"[][]()", "[[([]([])()[])]]"是合法的; "([(])", "[())"是不合法的。

遍歷字符串的每一個char, 將char與棧頂元素比較. 如果char和棧頂元素配對, 則char不入棧, 否則將char入棧. 當遍歷完成時棧為空說明字符串是合法的。

public boolean isMatch(String str) {      MyStack<Character> myStack = new MyArrayStack<Character>();      char[] arr = str.toCharArray();      for (char c : arr) {          Character temp = myStack.pop();          // 棧為空時只將c入棧          if (temp == null) {              myStack.push(c);          }          // 配對時c不入棧          else if (temp == '[' && c == ']') {          }           // 配對時c不入棧          else if (temp == '(' && c == ')') {          }           // 不配對時c入棧          else {              myStack.push(temp);              myStack.push(c);          }      }      return myStack.isEmpty();  }

3. 行編輯: 輸入行中字符'#'表示退格, '@'表示之前的輸入全都無效。

使用棧保存輸入的字符, 如果遇到'#'就將棧頂出棧, 如果遇到@就清空棧. 輸入完成時將棧中所有字符出棧后反轉就是輸入的結果:

private String lineEdit(String input) {      MyStack<Character> myStack = new MyArrayStack<Character>();      char[] arr = input.toCharArray();      for (char c : arr) {          if (c == '#') {              myStack.pop();          } else if (c == '@') {              myStack.clear();          } else {              myStack.push(c);          }      }            StringBuilder sb = new StringBuilder();      Character temp = null;      while ((temp = myStack.pop()) != null) {          sb.append(temp);      }      // 反轉字符串      sb.reverse();      return sb.toString();  }

到此,相信大家對“Java中的棧實現方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凤山市| 英德市| 库伦旗| 师宗县| 天峨县| 辽源市| 玛多县| 通江县| 乌拉特前旗| 长阳| 古蔺县| 仙居县| 西和县| 东山县| 临沧市| 天柱县| 镇远县| 汽车| 杭锦后旗| 蕲春县| 泰兴市| 屯留县| 松阳县| 如皋市| 延津县| 绥芬河市| 扶余县| 安化县| 龙游县| 奈曼旗| 同仁县| 儋州市| 祁门县| 台北县| 会同县| 三明市| 洛川县| 义乌市| 镇雄县| 米林县| 临汾市|