(Java資料結構和演算法)棧-----棧本質原理實現+ArrayDeque類實現
阿新 • • 發佈:2018-12-20
自定義棧
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("請輸入一字串: ");
}
}
}