java棧容器Stack類(lèi)
/**
* Stack類(lèi)extends Vector 棧容器
* 擴(kuò)充了五個(gè)方法 push() peek() pop() empty() search()
* 棧中的方法遵循后進(jìn)先出 main方法需要等所有方法執(zhí)行完彈出后才會(huì)彈出 方法的遞歸每一層都要等下一層結(jié)束/彈出才能結(jié)束/彈出
* 后進(jìn)的方法位于棧頂 彈出順序從棧頂往棧底
*/
public class TestStack {
? ?public static void main(String[] args) {
? ? ? ?Stack<String> st1 = new Stack<>();
? ? ? ?//實(shí)例化棧容器是為了使用Stack的五種方法 使用List引用的話無(wú)法調(diào)用這些方法 這里需要用Stack引用
? ? ? ?st1.push("a");
? ? ? ?//向棧容器中添加item 替代Vector的.add
? ? ? ?st1.push("b");
? ? ? ?//每一個(gè)新添加的item都會(huì)位于棧頂 1位 棧容器從1開(kāi)始算位置
? ? ? ?System.out.println(st1);
? ? ? ?//打印結(jié)果仍為[a,b] 但這不符合棧容器的用法
? ? ? ?st1.push("c");
? ? ? ?//將item推進(jìn)棧中
? ? ? ?System.out.println(st1.search("c")+"結(jié)果為1 最后添加的c會(huì)位于棧頂 1位");
? ? ? ?System.out.println(st1.search("a")+"結(jié)果為3 目前有三個(gè)item 最早添加的a位于最下側(cè) 3位");
????????//.search()方法從棧頂往棧底查找返回匹配的第一個(gè)元素,無(wú)論底下是否有重復(fù)元素都只會(huì)返回第一個(gè)
? ? ? ?String pop1 = st1.pop();
? ? ? ?System.out.println(pop1);
? ? ? ?//.pop()會(huì)將棧頂?shù)膇tem彈出 并返回該item c在棧頂 結(jié)果為c 彈出后b在棧頂
? ? ? ?System.out.println(st1.peek());
? ? ? ?//peek偷窺 返回棧頂?shù)膇tem但不刪除 結(jié)果為b 固定查看棧頂?shù)膇tem
? ? ? ?System.out.println(st1.empty());
? ? ? ?//.empty()判斷棧容器是否為空 替代Vector的.isEmpty()
? ? ? ?//利用Stack判斷對(duì)稱性
? ? ? ?String str = "..{...[...(...)....]....}....(...).....[....]";
????????//模擬一段代碼的語(yǔ)句,這里用...代替代碼的字符,只看三種括號(hào),代碼中的括號(hào)一定是對(duì)稱的,有左括號(hào)就有右括號(hào)
? ? ? ?System.out.println(symmetry(str));
? ? ? ?//symmetry對(duì)稱性 ?這里忽略...判斷括號(hào)的對(duì)稱性 括號(hào)是成對(duì)使用的 并且遵守后進(jìn)先出
? ? ? ?// 這個(gè)方法用于判斷語(yǔ)句結(jié)構(gòu)的問(wèn)題 如左括號(hào)和右括號(hào)數(shù)量不一致、語(yǔ)句中途在沒(méi)有左括號(hào)的情況下出現(xiàn)右括號(hào)
? ?}
?? ?static boolean symmetry(String str){
? ? ? ?Stack<String> s = new Stack<>();
? ? ? ?for (int i = 0;i<str.length();i++){
? ? ? ? ? ?//.length()字符串的長(zhǎng)度
? ? ? ? ? ?char c = str.charAt(i);
? ? ? ? ? ?//返回index位的字符
? ? ? ? ? ?if (c=='{'){
? ? ? ? ? ? ? ?s.push("}");
? ? ? ? ? ?}
? ? ? ? ? ?if (c=='['){
? ? ? ? ? ? ? ?s.push("]");
? ? ? ? ? ?}
? ? ? ? ? ?if (c=='('){
? ? ? ? ? ? ? ?s.push(")");
? ? ? ? ? ?}
? ? ? ? ? ?//括號(hào)一定是先寫(xiě)左括號(hào) 每一個(gè)左括號(hào)都應(yīng)當(dāng)對(duì)應(yīng)一個(gè)右括號(hào)
? ? ? ? ? ?//當(dāng)出現(xiàn)左括號(hào) 向Stack棧容器中添加一個(gè)右括號(hào) 當(dāng)出現(xiàn)右括號(hào) 從Stack中pop右括號(hào)
? ? ? ? ? ?if (c=='}'||c==']'||c==')'){
? ? ? ? ? ? ? ?if (!s.empty()) {
? ? ? ? ? ? ? ? ? ?String pop = s.pop();
? ? ? ? ? ? ? ? ? ?//彈出棧頂?shù)睦ㄌ?hào) 要彈出就要確保容器中有元素 先判定是否為空
? ? ? ? ? ? ? ? ? ?if (pop.charAt(0) != c) {
? ? ? ? ? ? ? ? ? ? ? ?//彈出的字符串為一個(gè)右括號(hào) 對(duì)字符串取0位字符即將字符串括號(hào)轉(zhuǎn)化為字符
? ? ? ? ? ? ? ? ? ? ? ?//如果先出的不是最后入的括號(hào)種類(lèi) 說(shuō)明符號(hào)不對(duì)稱
? ? ? ? ? ? ? ? ? ? ? ?return false;
? ? ? ? ? ? ? ? ? ?}
// ? ? ? ? ? ? ? ? ?String cTemp = ""+c;也可以將字符c轉(zhuǎn)換為字符串判定
// ? ? ? ? ? ? ? ? ?if(!cTemp.equals(s.pop()))return false;
// ? ? ? ? ? ? ? ? ?又或者s定義為Stack<Char> 直接比較字符
? ? ? ? ? ? ? ?}else {
? ? ? ? ? ? ? ? ? ?//如果s為空說(shuō)明字符串中缺少左括號(hào) 不對(duì)稱
? ? ? ? ? ? ? ? ? ?return false;
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}
? ? ? ?}
// ? ? ? ?if (!s.empty()){
// ? ? ? ? ? ?//如果字符串遍歷完,容器中還有括號(hào)沒(méi)被pop說(shuō)明字符串左右括號(hào)數(shù)量不對(duì)等
// ? ? ? ? ? ?return false;
// ? ? ? ?}
// ? ? ? ?return true;對(duì)稱返回true
? ? ? ?return s.empty();
? ? ? ?//判斷s是否為空的結(jié)果決定了是否對(duì)稱,為空則對(duì)稱,不為空則不對(duì)稱,所以直接返回s.empty()即為對(duì)稱性的結(jié)果
? ?}
}