1.基本结构
2.常见操作
private int maxSize; // 栈的大小
private int[] stack; // 数组,数组模拟栈,数据就放在该数组
private int top = -1;// top表示栈顶,初始化为-1
// 构造函数
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[maxSize];
}
// 判断栈是否满
public boolean isFull() {
return top == maxSize - 1;
}
// 判断栈是否空
public boolean isEmpty() {
return top == -1;
}
3.代码实现
public void push(int value) {
if(isFull()) { //先判断栈是否满
System.out.println("栈满");
return;
}
top++;
stack[top] = value;
}
public int pop() {
//先判断栈是否空
if(isEmpty()) {
//抛出异常
throw new RuntimeException("栈空,没有数据~");
}
top--;
return stack[top];
}
// 遍历栈
public void list() {
if(isEmpty()) {
System.out.println("栈空,没有数据~~");
return;
}
//需要从栈顶开始显示数据
for(int i = top; i >= 0 ; i--) {
System.out.printf("stack[%d]=%d\n", i, stack[i]);
}
}
4.练习题
1.有效的括号
思路:将左括号遍历放入栈中,如果遍历到右括号,则把栈中的元素pop出来进行对比。
True的条件:所有元素都扫描完,且栈为空
private static HashMap<Character, Character> map = new HashMap<>();
static {
// key - value
map.put('(', ')');
map.put('{', '}');
map.put('[', ']');
}
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
int len = s.length();
for (int i = 0; i < len; i++) { //开始遍历
char c = s.charAt(i); //取出这个字符
if (map.containsKey(c)) { // 将左括号放入栈中
stack.push(c);
} else { // 如果是右括号
if (stack.isEmpty()) return false;
if (c != map.get(stack.pop())) return false;
}
}
return stack.isEmpty();
}