Stack的用例Parentheses,输入一串括号用栈判断其中的括号是否匹配,例如[()]{()}程序打印true,对于[](则打印false。
思路:
遇到左括号入栈,遇到右括号时先检查栈是否为空,若空则返回false,若不空则弹出栈顶元素看与右括号是否匹配。所有元素处理完后若栈为空则说明匹配成功,否则匹配不成功。
Java代码实现:
import java.util.Scanner;
public class Parentheses{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String s = scanner.next();
System.out.println(isBalanced(s));
}
public static boolean isBalanced(String s){
Stack<Character> stack = new Stack<Character>();
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='(' || s.charAt(i)=='[' || s.charAt(i)=='{')
stack.push(s.charAt(i));
else if(s.charAt(i)==')'){
if(stack.isEmpty()) return false;
if(stack.pop()!='(') return false;
//在出栈操作之前应判断栈是否为空
}
else if(s.charAt(i)==']'){
if(stack.isEmpty()) return false;
if(stack.pop()!='[') return false;
}
else if(s.charAt(i)=='}'){
if(stack.isEmpty()) return false;
if(stack.pop()!='{') return false;
}
}
return stack.isEmpty();
}
}
泛型可迭代后进先出栈的API:
public class Stack< Item> implements Iterable< Item>
- Stack() 创建一个空栈
- void push(Item item) 添加一个元素
- Item pop() 删除最近添加的元素
- boolean isEmpty() 判断栈是否为空
- int size() 栈中的元素数量
链表实现的栈,可用于创建任意数据类型的栈:
import java.util.Iterator;
public class Stack<Item> implements Iterable<Item>{
private Node first; //栈顶,链表表头
private int N; //元素个数
private class Node{ //定义了结点的嵌套类
Item item;
Node next;
}
public int size(){
return N;
}
public boolean isEmpty(){
return N==0;
}
public void push(Item item){
Node oldfirst = first; //保存指向链表的指针
first = new Node(); //创建新结点,原链表引用指向新创建的结点
first.item = item; //为新结点的数据域赋值
first.next = oldfirst; //新结点的指针域指向原链表的首结点
N++;
}
public Item pop(){
Item item = first.item;
first = first.next;
N--;
return item;
}
public Iterator<Item> iterator(){
return new ListIterator();
}
public class ListIterator implements Iterator<Item>{
private Node current = first;
public boolean hasNext(){
return current!=null;
}
public void remove(){
}
public Item next(){
Item item = current.item;
current = current.next;
return item;
}
}
}