栈也是一种线性存储结构,具有先进后出的特点;word中的撤销操作,操作系统的方法调用都利用了栈;栈还可以用来做匹配,比如括号匹配等;基于数组的栈入栈push使用数组的addLast()追加;取数据时使用数组的getLast()做出栈pop()操作;
这次模拟实现的栈是基于上篇博客实现的动态数组实现的:
public interface Stack<E> {
void push(E e); //入栈
E pop(); //出栈
E peek(); //查看栈顶元素
boolean isEmpty();
int getSize();
}
package com.itheima.stack;
import com.itheima.array.Array; //这里的Array是自己实现的动态数组;代码在“数据结构与算法(一)——数组”的博客里
public class ArrayStack<E> implements Stack<E> {
Array<E> array;
public ArrayStack(int capacity) {
array = new Array<E>(capacity);
}
public ArrayStack() {
array = new Array<E>(10);
}
//入栈
public void push(E e) {
array.addLast(e);
}
//出栈
public E pop() {
return array.removeLast();
}
//取栈顶元素
public E peek() {
return array.getLast();
}
public boolean isEmpty() {
return array.isEmpty();
}
public int getSize() {
return array.getSize();
}
@Override
public String toString() {
StringBuffer res = new StringBuffer();
res.append("Stack:[");
for (int i = 0; i < array.getSize(); i++) {
res.append(array.get(i));
if(i<array.getSize()-1){
res.append(",");
}
}
res.append("]");
res.append("\ttop");
return res.toString();
}
}
测试:
基于栈的括号匹配:
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
for(int i = 0; i < s.length(); i++){
char c = s.charAt(i);
if(c == '(' || c == '{' || c=='['){
stack.push(c);
}else{
if(stack.isEmpty())
return false;
if(c==')' && stack.pop()!='(')
return false;
if(c==']' && stack.pop()!='[')
return false;
if(c=='}' && stack.pop()!='{')
return false;
}
}
return stack.isEmpty();
}
}