1. 程式人生 > >(Java資料結構和演算法)棧-----棧本質原理實現+ArrayDeque類實現

(Java資料結構和演算法)棧-----棧本質原理實現+ArrayDeque類實現

自定義棧

class MyStack{
	private int[] a;
	private int size;
	private int top;
	
	private final int ERROR = -1;//假設其他元素不會出現負數的前提下

	public MyStack(int size){
		this.size = size;
		a = new int[size];
		top = 0;//棧頂是幾,就說棧中有幾個元素
	}
	public boolean isFull(){
		return (top == size);
	}
	public boolean isEmpty(){
		return
(top == 0); } public boolean push(int e){ if(isFull()){ return false; }else{ a[top++] = e; return true; } } public boolean pop(){ if(isEmpty()){ return false; }else{ top--; return true; } } public int peek(){ if(!isEmpty()){ return a[top-1]; }else{ return
ERROR;//棧已經空,應該返回錯誤 } } public void print(){ for(int i = 0; i < top; i++){ System.out.print(a[i] +" "); } System.out.println(); } } public class Main{ //測試 public static void main(String[] args){ MyStack stack = new MyStack(10); System.out.println("入棧:"); stack.push(1); stack.
print(); stack.push(2); stack.print(); stack.push(3); stack.print(); stack.push(4); stack.print(); stack.push(5); stack.print(); System.out.println(); System.out.println("棧頂元素: "+stack.peek()); System.out.println("出棧:"); while(!stack.isEmpty()){ stack.print(); stack.pop(); } System.out.println("棧空嗎?"+stack.isEmpty()); } }

在這裡插入圖片描述

ArrayDeque類實現棧操作

import java.util.ArrayDeque;
import java.util.Iterator;

public class Main{
	
	public static void print(ArrayDeque stack){
		Iterator<ArrayDeque> it = stack.iterator();
		while(it.hasNext()){
			System.out.print(it.next()+" ");
		}
		System.out.println();
	}
	
	//測試
	public static void main(String[] args){
		ArrayDeque<Integer> stack = new ArrayDeque<>(10);
		System.out.println("入棧:");
		stack.push(1);
		print(stack);
		stack.push(2);
		print(stack);
		stack.push(3);
		print(stack);
		stack.push(4);
		print(stack);
		stack.push(5);
		print(stack);
		System.out.println();	

		System.out.println("棧頂元素: "+stack.peek());
		System.out.println("出棧:");
		while(!stack.isEmpty()){
			
			stack.pop();
			print(stack);
		}
		System.out.println("棧空嗎?"+stack.isEmpty());
	}
}

【例項】字串逆序

import java.util.ArrayDeque;
import java.util.Scanner;

public class Main{
	
	//測試
	public static void main(String[] args){
		ArrayDeque<Character> stack = new ArrayDeque<>(10);
		System.out.println("請輸入一字串: ");
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		for(int i = 0; i < str.length(); i++){
			stack.push(str.charAt(i));
		}
		while(!stack.isEmpty()){
			System.out.print(stack.peek());
			stack.pop();
		}
	}
}

在這裡插入圖片描述

另外,字串逆序可以直接呼叫StringBuffer的reverse方法即可:

import java.util.Scanner;

public class Main{
	
	//測試
	public static void main(String[] args){
		System.out.println("請輸入一字串: ");
		Scanner scan = new Scanner(System.in);
		StringBuffer str = new StringBuffer(scan.next());
		System.out.println(str.reverse());
	}
}

【例項】括號匹配問題

/*
	用棧來解決括號匹配問題:
	
	針對字串中的每個字元,
	(1)如果是(,[,{入棧;
	(2)如果是非括號,不入棧;
	(3)如果是),],},取出棧頂元素,比較棧頂元素和當前字元是否匹配,如果不匹配,可得出結論:不匹配;
	(4)如果所有字元已經完成棧操作,棧中仍然有剩餘的元素,可得出結論:不匹配;
	(5)除了以上不匹配情況外,得出結論:匹配。

*/

import java.util.Scanner;
import java.util.ArrayDeque;

public class Main{
	
	//測試
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		
		ArrayDeque<Character> stack = new ArrayDeque<>();
		
		String str = null;
		System.out.println("請輸入一字串: ");
		while(scan.hasNextLine()){
			stack.clear();
			str = scan.nextLine();
			boolean flag = true;
			for(int i = 0; i < str.length(); i++){
				Character c = str.charAt(i);
				Character top = stack.peek();
				
				switch(c){
					case '[': 
					case '(':
					case '{': 
						stack.push(c);
						break;
					case ')': 
						if(top != null && top == '('){
							stack.pop();
						}else{
							flag = false;
						}
						break;
					case ']': 
						if(top != null && top == '['){
							stack.pop();
						}else{
							flag = false;
						}
						break;
					case '}': 
						if(top != null && top == '{'){
							stack.pop();
						}else{
							flag = false;
						}
						break;
					default:	break;
				}
				if(!flag){
					break;
				}
			}
			if(!stack.isEmpty() || !flag){
				System.out.println("not correct");
			}else{
				System.out.println("correct");
			}
			System.out.println("請輸入一字串: ");
		}
	}
}

在這裡插入圖片描述