栈的特点就是先进后出(FILO)。数组加一个一直指向栈顶的指针,很好实现。
构造栈
import java.util.Arrays;
public class StackDemo<E> {
private static final int DEFAULT_CAPACITY = 10;//默认容量
private Object[] arr;//存储栈元素的数组
private int capacity;//容量
private int top;//栈顶指针
public StackDemo() {//结构体初始化对象
this.capacity = DEFAULT_CAPACITY;
arr = new Object[capacity];
top = -1;
}
/**
* 压入数据
*/
public void push(Object value) {
top++;
grow(top);
arr[top] = value;
}
/**
* 出栈
* @return
*/
public E pop() {
return (E)arr[top--];
}
/**
* 获取栈顶元素
* @return
*/
public E peek() {
return (E)arr[top];
}
/**
* 判空
* @return
*/
public boolean isEmpty() {
return top==-1;
}
/**
* 自动扩容每次扩容为原来的1.5倍
* @param size
*/
public void grow(int size) {
if(size>=capacity) {
int newcapacity = capacity +(capacity>>1);
this.capacity = newcapacity;
System.out.println(capacity);
arr = Arrays.copyOf(arr, newcapacity);
}
}
}
例子:括号匹配:假设有三种()、[]、{}。
思路:
(1)遍历字符串。遇到'('、'['和'{'时,则压入栈。
(2)遇到')'、']'、'}'时,首先判断栈是否为空,为空则返回false;
否则判断与栈顶元素是否匹配,匹配则出栈,否则返回false。
(3)最后判断一下栈是否为空,为空则表示匹配,返回true,否则返回false。
实现代码
static boolean brackets(String str) {
if(str==null||str=="") {
System.out.println("输入表达式为空或未输入");
}
StackDemo<Character> stack = new StackDemo<Character>();
for(int i = 0;i < str.length();i++) {
switch (str.charAt(i)) {
case '(':
stack.push(str.charAt(i));
break;
case '[':
stack.push(str.charAt(i));
break;
case '{':
stack.push(str.charAt(i));
break;
case ')':
if(!stack.isEmpty()&&stack.peek()=='(')
{
stack.pop() ;
}else {
return false;
}
break;
case ']':
if(!stack.isEmpty()&&stack.peek()=='[')
{
stack.pop() ;
}else {
return false;
}
break;
case '}':
if(!stack.isEmpty()&&stack.peek()=='{')
{
stack.pop() ;
}else {
return false;
}
}
}
if(stack.isEmpty()) {
return true;
}
return false;
}
测试用例
/**
* 输出为
* true
* false
* @param args
*/
public static void main(String[] args) {
String str1 = "(){21[{}]()}";
String str2 = "[(])";
System.out.println(brackets(str1));
System.out.println(brackets(str2));
}