1.1 基本概念
压栈:栈的插入操作叫做进栈/压栈/入栈。入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据在栈顶。
1.2 栈的基本操作
public class TestStack {
public static void main(String[] args) {
Stack<Integer> s=new Stack();
//入栈
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);
System.out.println(s.size());
System.out.println(s.peek());
s.pop();
s.pop();
System.out.println(s.peek());
if(s.empty()){
System.out.println("是空栈");
}else{
System.out.println("不是空栈");
}
}
}
1.3 模拟实现
public class TestStack02<E> {
E[] array=(E[])new Object[3];//栈的大小为3
int size=0;//
//1.入栈
public E push(E value){
// if(top==array.length){
// System.out.println("栈已满");
// }
ensureCapacity();
array[size++]=value;
return value;
}
//2.判断为空
public boolean empty(){
if(0==size){
return true;
}
return false;
}
public int size(){
return size;
}
//3.取出栈顶元素
public E peek(){
if(empty()){
throw new RuntimeException("栈为空,无法获取栈顶元素");
}
return array[size-1];
}
//4.出栈
public E pop(){
E value=peek();
size--;
return value;
}
public void ensureCapacity(){
if(size== array.length){
array= Arrays.copyOf(array,size*2);
}
}
//测试该类
public static void main(String[] args) {
TestStack02 ms = new TestStack02();
ms.push("hello");
ms.push("我");
ms.push("and");
ms.push("张张");
ms.push("yeap");
ms.push("!");
System.out.println(ms.size());
System.out.println(ms.peek());
System.out.println(ms.pop());
System.out.println(ms.pop());
System.out.println(ms.peek());
System.out.println(ms.empty());
}
}
1.4 oj题目
逆波兰表达式求值(如果是整数直接入栈,如果是运算符,取两个元素进行操作后再将结果入栈)
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> s=new Stack<>();
for(String e : tokens){
if(!((e.equals("+")) || (e.equals("*"))
|| (e.equals("-")) || (e.equals("/")) )){
s.push(Integer.parseInt(e));
}else{
int right=s.pop();
int left =s.pop();
switch(e){
case"+":
s.push(left+right);
break;
case"-":
s.push(left-right);
break;
case"*":
s.push(left*right);
break;
case"/":
s.push(left/right);
break;
}
}
}
return s.peek();
}
}