栈
也是一种线性结构,其实你就可以把理解为数组,只能从一端添加元素,也只能从哪一端删除数据。
这一端称为栈顶,
栈是一种后进先出的数据结构,可以理解,吃了就吐
力扣的一道题 利用栈来解答
以下是java代码
package com.binglian.stack;
import java.util.Stack;
/**
* 栈
* 括号匹配应用
* @author binglian
*
*/
public 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;
char topChar =stack.pop();
if(c == ')' && topChar != '(')
return false;
if(c == ']' && topChar !='[')
return false;
if(c == '}' && topChar != '{')
return false;
}
}
return stack.isEmpty();
}
}
队列
然后是我们的队列
队列和栈都是一种线性结构 就是一条线 可以认为这样
只能从一端添加元素(队尾),从另一端取出元素(队首)
先进先出、吃了就拉
可以使用数组来实现队列,我这里用循环队列
以下是思路
front==tail 队列为空(队首和队尾相等那么就为空)
(tail+1)%c ==front队列满(如果队尾加1 队列的元素 取余 相等那么就为满,是不是觉得和上面那个很像,其实这里是 和队列元素长度取余在判断)
在循环队列要浪费一个空间,
以下代码,要仔细看哦 有注解的
package com.binglian.stack;
/**
* 循环队列
* @author binglian
*
* @param <E>
*/
public class LoopQueue<E> {
private E[] data;
private int front,tail;//front 队头 tail队尾
private int size;//元素长度
/**
* 构造方法 生成初始化队列
* @param capacity
*/
public LoopQueue(int capacity){
data=(E[])new Object[capacity+1];
front=0;
tail=0;
size=0;
}
/**
* 默认长度为10的队列
*/
public LoopQueue(){
this(10);
}
/**
* 因为循环队列最后要被浪费一个空间 所以减一
* @return
*/
public int getCapacity(){
return data.length-1;
}
/**
* 判断是否为空
*/
public boolean isEmpty(){
return front == tail;//队尾和队首相等那么没有元素
}
/**
* 队列元素长度
* @return
*/
public int getSize(){
return size;
}
/**
* 入队操作
*/
public void enqueue(E e){
if((tail+1) % data.length ==front){//如果tail+1 %data的长度 等于队首那么就满了
resize(getCapacity()*2);//满了之后创建新的队列并吧 新的队列元素放进去
}
data[tail]=e;
tail=(tail+1)%data.length;
size++;
}
/**
* 移除元素
*/
public E dequeue(){
if(isEmpty())
throw new IllegalArgumentException("队列为空,没有元素,可以移除");
E ret=data[front];
data[front]=null;
front=(front+1) %data.length;
size--;
if(size == getCapacity() /4 && getCapacity() /2 !=0 )//判断 队列是否有多余空与空间 然后进行缩小队列
resize(getCapacity()/2);
return ret;
}
/**
* 查看队首元素
* @return
*/
public E getFron(){
if(isEmpty())
throw new IllegalArgumentException("队列为空,没有元素,");
return data[front];
}
/**
* 创建新的队列,并把数据移进去
* @param newCapacity
*/
private void resize(int newCapacity){
E[] newData=(E[])new Object[newCapacity +1];//创建新的队列
//吧原来队列的元素,移到新的队列
for(int i=0;i<size;i++){
newData[i]=data[(i+front)% data.length];//重点
}
data=newData;
front=0;
tail=size;
}
@Override
public String toString(){
StringBuilder res=new StringBuilder();
res.append(String.format("Queue:size=%d,capacity=%d\n", size,getCapacity()));
res.append("front[");
for (int i = front; i !=tail;i=(i+1) %data.length) {
res.append(data[i]);
if((i+1)%data.length !=tail)
res.append(",");
}
res.append("]tail");
return res.toString();
}
public static void main(String[] args) {
LoopQueue<Integer> queue=new LoopQueue<Integer>();
for(int i=0;i<10;i++){
queue.enqueue(i);
System.out.println(queue);
if(i%3 ==2){
queue.dequeue();
System.out.println(queue);
}
}
}
}