栈描述
栈也是一种线性数据结构 规定只能从栈顶添加元素,也只能从栈顶取出元素 栈是一种后进先出的数据结构 栈就相当于是一个箱子,入栈就是向箱子里面放书,出栈就是从箱子里面取书,因为取书只能取最后一本书,所以栈是一个先进后出的数据结构
创建栈
1.先创建一个栈接口
public interface StackInterface < T> {
public int getSize ( ) ;
public boolean isEmpty ( ) ;
public void push ( T ele) ;
public T pop ( ) ;
public T peek ( ) ;
}
2.实现栈
先声明栈,栈也是一个数组
在给出栈元素的数量 判断栈存了多少元素,只需要返回栈的元素个数即可所以时间复杂度为O(1) 判断栈是否为空,同上时间复杂度为O(1) 入栈,实际上就是给数组的尾部添加元素,所以时间复杂度为O(1)
但是会有栈满,需要扩容问题 我们使用了均摊复杂度,因为不是每次都需要扩容 均摊后时间复杂度为O(1) 出栈,一样是给数组的尾部删除元素,所以时间复杂度为O(1) 查看栈顶元素,就是数组的查询数组的尾部元素,所以时间复杂度为O(1)
public class MyStack < T> implements StackInterface < T> {
private MyArray< T> data;
private int size;
public MyStack ( ) {
data = new MyArray < > ( ) ;
size = 0 ;
}
@Override
public int getSize ( ) {
return size;
}
@Override
public boolean isEmpty ( ) {
return size == 0 ;
}
@Override
public void push ( T ele) {
try {
data. addTail ( ele) ;
size++ ;
} catch ( IllegalAccessException e) {
e. printStackTrace ( ) ;
}
}
@Override
public T pop ( ) {
T result = null;
try {
result = data. removeTail ( ) ;
size-- ;
} catch ( IllegalAccessException e) {
e. printStackTrace ( ) ;
}
return result;
}
@Override
public T peek ( ) {
try {
return data. getTail ( ) ;
} catch ( IllegalAccessException e) {
e. printStackTrace ( ) ;
return null;
}
}
@Override
public String toString ( ) {
StringBuilder result = new StringBuilder ( ) ;
result. append ( "栈中总共存" + size + "元素个数" ) ;
result. append ( "[" ) ;
try {
for ( int i = 0 ; i < size; i++ ) {
result. append ( data. getEleByIndex ( i) ) ;
if ( i != size - 1 ) {
result. append ( "," ) ;
}
}
result. append ( "] 栈顶" ) ;
return result. toString ( ) ;
} catch ( IllegalAccessException e) {
e. printStackTrace ( ) ;
return null;
}
}
}
栈的应用
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
力扣20题
public boolean isValid ( String s) {
if ( s == null || s. isEmpty ( ) ) {
return true ;
}
Stack< Character> stack = new Stack < > ( ) ;
for ( int i = 0 ; i < s. length ( ) ; i++ ) {
char lentter = s. charAt ( i) ;
if ( lentter == '{' || lentter == '[' || lentter == '(' ) {
stack. push ( lentter) ;
} else {
if ( stack. isEmpty ( ) ) {
return false ;
} else {
char pop = stack. pop ( ) ;
if ( lentter == '}' && pop != '{' ) {
return false ;
} else if ( lentter == ']' && pop != '[' ) {
return false ;
} else if ( lentter == ')' && pop != '(' ) {
return false ;
}
}
}
}
return stack. isEmpty ( ) ;
}