亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java 實(shí)現(xiàn) stack詳解及實(shí)例代碼

 更新時(shí)間:2016年09月26日 10:11:16   投稿:lqh  
這篇文章主要介紹了java 實(shí)現(xiàn) stack詳解的相關(guān)資料,需要的朋友可以參考下

棧是限制插入和刪除只能在一個(gè)位置上進(jìn)行的 List,該位置是 List 的末端,叫做棧的頂(top),對(duì)于棧的基本操作有 push 和 pop,前者是插入,后者是刪除。

棧也是 FIFO 表。

棧的實(shí)現(xiàn)有兩種,一種是使用數(shù)組,一種是使用鏈表。

public class MyArrayStack<E> {

 private ArrayList<E> list = new ArrayList<>();

 public void push(E e) {
 list.add(e);
 }

 public E pop() {
 return list.remove(list.size() - 1);
 }

 public E peek() {
 return list.get(list.size() - 1);
 }

 public boolean isEmpty() {
 return list.size() == 0;
 }
}

public class MyLinkStack<E> {

 LinkedList<E> list = new LinkedList<>();

 public void push(E e) {
 list.addLast(e);
 }

 public E pop() {
 return list.removeLast();
 }

 public E peek() {
 return list.getLast();
 }

 public boolean isEmpty() {
 return list.size() == 0;
 }
}

棧的應(yīng)用

平衡符號(hào)

給定一串代碼,我們檢查這段代碼當(dāng)中的括號(hào)是否符合語(yǔ)法。

例如:[{()}] 這樣是合法的,但是 [{]}() 就是不合法的。

如下是測(cè)試代碼:

public class BalanceSymbol {

 public boolean isBalance(String string) {
 MyArrayStack<Character> stack = new MyArrayStack<>();
 char[] array = string.toCharArray();
 for (char ch : array) {
  if ("{[(".indexOf(ch) >= 0) {
  stack.push(ch);
  } else if ("}])".indexOf(ch) >= 0) {
  if (isMatching(stack.peek(), ch)) {
   stack.pop();
  }
  }
 }

 return stack.isEmpty();
 }

 private boolean isMatching(char peek, char ch) {
 if ((peek == '{' && ch == '}') || (peek == '[' && ch == ']') || (peek == '(' && ch == ')')) {
  return true;
 }
 return false;
 }

 public static void main(String[] args) {
 BalanceSymbol symbol = new BalanceSymbol();
 String string = "public static void main(String[] args) {BalanceSymbol symbol = new BalanceSymbol();}";
 String string2 = "public static void main(String[] args) {BalanceSymbol symbol = new BalanceSymbol([);}]";
 System.out.println(symbol.isBalance(string));
 System.out.println(symbol.isBalance(string2));
 }
}

后綴表達(dá)式

例如一個(gè)如下輸入,算出相應(yīng)的結(jié)果,

3 + 2 + 3 * 2 = ?

這個(gè)在計(jì)算順序上不同會(huì)產(chǎn)生不同的結(jié)果,如果從左到右計(jì)算結(jié)果是 16,如果按照數(shù)學(xué)優(yōu)先級(jí)計(jì)算結(jié)果是 11。

如果把上述的中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式:

3 2 + 3 2 * +

如果使用后綴表達(dá)式來(lái)計(jì)算這個(gè)表達(dá)式的值就會(huì)非常簡(jiǎn)單,只需要使用一個(gè)棧。

每當(dāng)遇到數(shù)字的時(shí)候,把數(shù)字入棧。

每當(dāng)遇到操作符,彈出2個(gè)元素根據(jù)操作符計(jì)算后,入棧。

最終彈出棧的唯一元素就是計(jì)算結(jié)果。

/**
 * 簡(jiǎn)化版本,每個(gè)操作數(shù)只一位,并且假設(shè)字符串合法
 */
public class PostfixExpression {

 public static int calculate(String string) {
 MyArrayStack<String> stack = new MyArrayStack<>();

 char[] arr = string.toCharArray();

 for (char ch : arr) {
  if ("0123456789".indexOf(ch) >= 0) {
  stack.push(ch + "");
  } else if ("+-*/".indexOf(ch) >= 0) {
  int a = Integer.parseInt(stack.pop());
  int b = Integer.parseInt(stack.pop());
  if (ch == '+') {
   stack.push((a + b) + "");
  } else if (ch == '-') {
   stack.push((a - b) + "");
  } else if (ch == '*') {
   stack.push((a * b) + "");
  } else if (ch == '/') {
   stack.push((a / b) + "");
  }
  }
 }
 return Integer.parseInt(stack.peek());
 }

 public static void main(String[] args) {
 System.out.println(calculate("32+32*+"));
 }
}

中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式

假設(shè)只運(yùn)行 +,-,*,/,() 這幾種表達(dá)式。并且表達(dá)式合法。

a + b * c - (d * e + f) / g 轉(zhuǎn)換后的后綴表達(dá)式如下:

a b c * + d e * f + g / -

使用棧中綴轉(zhuǎn)后綴步驟如下:

  1. 當(dāng)讀到操作數(shù)立即把它輸出
  2. 如果遇到操作符入棧,如果遇到的左括號(hào)也放到棧中
  3. 如果遇到右括號(hào),就開(kāi)始彈出棧元素,直到遇到對(duì)應(yīng)的左括號(hào),左括號(hào)只彈出不輸出。
  4. 如果遇到其他符號(hào),那么從棧中彈出棧元素知道發(fā)現(xiàn)優(yōu)先級(jí)更低的元素為止。
import java.util.HashMap;
import java.util.Map;

public class ExpressionSwitch {

 private static Map<Character, Integer> map = new HashMap<Character, Integer>();

 static {
 map.put('+', 0);
 map.put('-', 1);
 map.put('*', 2);
 map.put('/', 3);
 map.put('(', 4);
 }

 private static char[][] priority = {
  // 當(dāng)前操作符
  //    +  -  *  /  ( 
  /* 棧 + */{ '>', '>', '<', '<', '<'},
  /* 頂 - */{ '>', '>', '<', '<', '<'},
  /* 操 * */{ '>', '>', '>', '>', '<'},
  /* 作 / */{ '>', '>', '>', '>', '<'},
     /* 符 ( */{ '<', '<', '<', '<', '<'},
 };

 public static String switch1(String string) {
 StringBuilder builder = new StringBuilder();

 char[] arr = string.toCharArray();

 MyArrayStack<Character> stack = new MyArrayStack<>();
 for (char ch : arr) {
  if ("0123456789abcdefghijklmnopqrstuvwxyz".indexOf(ch) >= 0) {
  builder.append(ch);
  } else if ('(' == ch) {
  stack.push(ch);
  } else if (')' == ch) {
  while (true && !stack.isEmpty()) {
   char tmp = stack.pop();
   if (tmp == '(') {
   break;
   } else {
   builder.append(tmp);
   }
  }
  } else {
  while (true) {
   if (stack.isEmpty()) {
   stack.push(ch);
   break;
   }
   char tmp = stack.peek();
   if (isPriorityHigh(tmp, ch)) {
   builder.append(stack.pop());
   } else {
   stack.push(ch);
   break;
   }
  }
  }
 }

 while(!stack.isEmpty()) {
  builder.append(stack.pop());
 }

 return builder.toString();
 }

 private static boolean isPriorityHigh(char tmp, char ch) {
 return priority[map.get(tmp)][map.get(ch)] == '>';
 }

 public static void main(String[] args) {
 System.out.println(switch1("a+b*c-(d*e+f)/g"));
 }
}
 

通過(guò)此文,希望大家對(duì)Java stack 的知識(shí)掌握,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Java判斷字符串中是否包含中文方法

    Java判斷字符串中是否包含中文方法

    這篇文章主要介紹了Java判斷字符串中是否包含中文方法,使用Matcher類(lèi)解決了這個(gè)問(wèn)題,需要的朋友可以參考下
    2014-06-06
  • Java?并發(fā)編程之ForkJoin框架

    Java?并發(fā)編程之ForkJoin框架

    這篇文章主要為大家介紹了Java?ForkJoin框架,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助,希望能夠給你帶來(lái)幫助
    2021-11-11
  • JDK輸入命令Javac報(bào)錯(cuò)的解決方法

    JDK輸入命令Javac報(bào)錯(cuò)的解決方法

    相信很多人都經(jīng)歷過(guò)配置環(huán)境變量失敗的經(jīng)歷,尤其是很多時(shí)候明明按照老師教的步驟或者教程上的方法循規(guī)守矩配置卻還是出錯(cuò),下面我們來(lái)解決一個(gè)非常蹊蹺的問(wèn)題---輸入Java和Java -version都沒(méi)問(wèn)題,但是輸入Javac報(bào)錯(cuò),感興趣的朋友一起看看吧
    2023-11-11
  • 詳解springboot測(cè)試類(lèi)注解

    詳解springboot測(cè)試類(lèi)注解

    這篇文章主要介紹了springboot測(cè)試類(lèi)注解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • crawler4j抓取頁(yè)面使用jsoup解析html時(shí)的解決方法

    crawler4j抓取頁(yè)面使用jsoup解析html時(shí)的解決方法

    crawler4j對(duì)response沒(méi)有指定編碼的頁(yè)面,解析成亂碼,很讓人煩惱,下面給出解決方法,需要的朋友可以參考下
    2014-04-04
  • 一文揭曉如何在Java中終止一個(gè)線程

    一文揭曉如何在Java中終止一個(gè)線程

    工作中我們經(jīng)常會(huì)用到線程,一般情況下我們讓線程執(zhí)行就完事了,那么你們有沒(méi)有想過(guò)如何去終止一個(gè)正在運(yùn)行的線程呢?本文就來(lái)帶大家一起看看
    2023-03-03
  • SpringBoot如何通過(guò)@Profile注解配置多環(huán)境

    SpringBoot如何通過(guò)@Profile注解配置多環(huán)境

    在Spring中,可以使用配置文件的方式來(lái)指定不同環(huán)境下所需要的配置信息,本文給大家介紹SpringBoot如何通過(guò)@Profile注解配置多環(huán)境,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • JAVA 靜態(tài)代理模式詳解及實(shí)例應(yīng)用

    JAVA 靜態(tài)代理模式詳解及實(shí)例應(yīng)用

    這篇文章主要介紹了JAVA 靜態(tài)代理模式詳解及實(shí)例應(yīng)用的相關(guān)資料,這里舉例說(shuō)明java 靜態(tài)代理模式該如何使用,幫助大家學(xué)習(xí)參考,需要的朋友可以參考下
    2016-11-11
  • Springboot2.7+Minio8 實(shí)現(xiàn)大文件分片上傳

    Springboot2.7+Minio8 實(shí)現(xiàn)大文件分片上傳

    本文主要介紹了Springboot2.7+Minio8 實(shí)現(xiàn)大文件分片上傳,通過(guò)文件切片上傳,我們能夠提高文件上傳的速度,優(yōu)化用戶體驗(yàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Java設(shè)計(jì)模式之創(chuàng)建者模式詳解

    Java設(shè)計(jì)模式之創(chuàng)建者模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之創(chuàng)建者模式詳解,創(chuàng)建者模式,顧名思義,就是提供友好的創(chuàng)建對(duì)象的方式?,對(duì)象都是?new?出來(lái)的,但是在一些情況下,這種方式不是很友好,首先,它不夠直觀,需要的朋友可以參考下
    2023-08-08

最新評(píng)論