1.栈的基础结构(他的本质就是数组,别想太多东西)
public class MyStack { int[] array; int usedsize; //栈中被使用了几个元素 public MyStack() { array = new int[5]; }
2.栈是不是满(满了要扩容) ,不用返回东西,满了进行操作就好,用于入栈
//是否为满 public void isFull(){ if(usedsize==5){ array= Arrays.copyOf(this.array,2*array.length); }
3.是否为空,用于删除时候,判断是否用删除
//是否为空 public boolean isEmpty(){ if(usedsize==0){ return true; } else return false; }
4.获取栈顶元素,并不删除
//获取栈顶元素 public int peek(){ return array[usedsize-1]; //就是栈中有几个元素-1,就是结尾的下标 }
5.压栈
//压栈 public void push(int data){ isFull(); //满了扩容,不满就直接进去就好。 array[usedsize++]=data; }
6.删除栈顶元素
//删除栈顶元素 public boolean pop(){ if(isEmpty()){ //判断是不是空,空了就不可以删除 return false; }else usedsize--; return true; }
7.遍历并打印栈中元素
//遍历栈 public void display(){ for(int i=0;i<usedsize;i++){ System.out.println(array[i]); }
他的操作还是很简单,当然有时候用集合框架一套就行,但是基本操作还是要会的
下面两道经典小题
1.括号匹配,很经典 链接 //力扣
首先思路说一下:如果他给的符号不是偶数肯定不匹配,
char [] t=s.toCharArray() toCharArray这块要复习一下,是把字符串转换为字符数组,然后如果栈空,就直接入栈,,如果栈不空,来看括号是否有和他相匹配的,我的思路是栈里面有左括号,然后数组中假如有右括号,并且和他匹配,就弹一个栈,相当于把一个括号消掉了,假如没有相匹配的,那么就入栈。
另外:换句话说左括号全部入栈,看栈顶和t[i](右括号)是否匹配。
class Solution { public boolean isValid(String s) { Stack<Character>stack=new Stack<Character>(); if(s.length()%2!=0){ return false; } char[] t=s.toCharArray(); for(int i=0;i<s.length();i++){ if(stack.isEmpty()) //空就入栈 stack.push(t[i]); else if((stack.peek()=='{'&&t[i]=='}')||(stack.peek()=='('&&t[i]==')')||(stack.peek()=='['&&t[i]==']')){ stack.pop(); //匹配上就删除栈顶元素 } else stack.push(t[i]); //否则入栈 } return stack.isEmpty(); //返回是否为空,空就说明匹配上了 } }
2.逆波兰表达式(经典) 链接:力扣
刚开始看没有用题,最后一句才是重点
适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
这句话才是最重要的。
细节的小知识点补充:1.字符的比较是用equals(里面是字符)。
2.Integer.parseInt(字符串)字符串转数字
class Solution { public int evalRPN(String[] tokens) { Stack<Integer> stack=new Stack<>(); for(int i=0;i<tokens.length;i++){ String m=tokens[i]; if (!(m.equals("+")||m.equals("-")||m.equals("*")||m.equals("/"))) { stack.push(Integer.parseInt(m));} //(不是加减乘除,数字入栈) if(m.equals("+")){ int a=stack.peek(); //取栈顶a和栈顶b,取出来一个删除一个 stack.pop(); int b=stack.peek(); stack.pop(); stack.push(a+b); } if(m.equals("-")){ //-号和/号有细节问题 int a=stack.peek(); // 13-5 的波兰式子是 13 5 - stack.pop(); //5在栈中比13会先出来,所以后减前 int b=stack.peek(); stack.pop(); stack.push(b-a); } if(m.equals("*")){ int a=stack.peek(); stack.pop(); int b=stack.peek(); stack.pop(); stack.push(a*b); } if(m.equals("/")){ int a=stack.peek(); // 13/5 的波兰式子是 13 5 / stack.pop(); //5在栈中比13会先出来,所以后除前 int b=stack.peek(); stack.pop(); stack.push(b/a); } } return stack.peek(); } }