1.栈的构建
- 栈的思想是先进后出,后进先出的模式,类似向容器加东西和向容器取东西
- 栈的底层实现有两种:栈基于链表的实现和基于数组的实现,它们的性能对比如下:
- 从逻辑结构角度来看
a、数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,
可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
b、链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、
删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
- 从内存存储角度来看
a、(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。
b、 链表从堆中分配空间, 自由度大但申请管理比较麻烦.
1.1基于数组的栈构建,主要由栈顶指针来控制
package Stack;
public class Stackdefine {
public static void main(String[] args) {
}
}
//数组定义栈
class ArrayStack{
private int maxSize; //定义大小
private int top=-1; //定义栈顶
private int[] Stacks; //定义栈
public ArrayStack(int maxSize){
this.maxSize = maxSize;
Stacks = new int[this.maxSize];
}
//定义栈满
public boolean isFull() {
return maxSize-1==top;
}
//定义空栈
public boolean isEmpty() {
return top==-1;
}
//入栈
public void addSk(int item) {
if(isFull()) {
System.out.println("栈满了");
return;
}
top++;
Stacks[top] = item;
}
//出栈,返回数据
public int popSk() {
if(isEmpty()) {
throw new RuntimeException("栈为空");
}
int item =Stacks[top];
top--;
return item;
}
//遍历栈,从栈顶开始
public void show() {
if(isEmpty()) {
System.out.println("栈为空");
return;
}
for(int i =top;i>-1;i--) {
System.out.printf("Stacks[%d] =%d\n",i,Stacks[i]);
}
}
}
**测试,在main方法中测试各种方法**
ArrayStack stack = new ArrayStack(5);
stack.addSk(5);//添加数据5-4-3-2-1
stack.addSk(4);
stack.addSk(3);
stack.addSk(2);
stack.addSk(1);
stack.isFull(); //判断是否满了
stack.show(); // 显示数据
System.out.println();
int item=stack.popSk();
System.out.println(item+" ");
stack.isEmpty(); //判断是否为空
测试结果符合栈的特点:
- 栈(Stack)作为一种先进后出的数据结构,在符号检测,计算的后缀表达式等应用非常方便。
1.栈的API
- Stack类通过继承了Vector类,可以创建实例对象来调用方法,从而扩展应用了下面五个方法: Object push(Object
element):将元素推送到堆栈顶部。 Object
pop():移除并返回堆栈的顶部元素。如果我们在调用堆栈为空时调用pop,则抛出’EmptyStackException’异常。
Object peek():返回堆栈顶部的元素,但不删除它。 boolean
empty():如果堆栈顶部没有任何内容,则返回true。否则,返回false。 int search(Object
element):确定对象是否存在于堆栈中。它将从堆栈顶部返回元素的位置。否则,它返回-1
- 2.栈的应用:
- 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
- 有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 注意空字符串可被认为是有效字符串。
import java.util.Stack;
public boolean isValid(String s) {
//考虑边界条件
if(s.length()%2==1){return false;}
Stack<Character> st = new Stack<Character>();
char []c = s.toCharArray(); //字符串转字符数组
for(char item:c){
if(item=='('||item=='['||item=='{'){
st.push(item);
}else{
if(st.isEmpty()){return false;}
if(item==')'&& st.pop()!='('){
return false;
}
if(item==']'&& st.pop()!='['){
return false;
}
if(item=='}'&& st.pop()!='{'){
return false;
}
}
}
return st.isEmpty(); //为空则全部匹配,否则多出来右括号
}