java 栈+队列数据结构

也是一种线性结构,其实你就可以把理解为数组,只能从一端添加元素,也只能从哪一端删除数据。

这一端称为栈顶,

栈是一种后进先出的数据结构,可以理解,吃了就吐

力扣的一道题 利用栈来解答

以下是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);
			}
		}
	}
}


github地址https://github.com/binlian/binglian-DateStructure

猜你喜欢

转载自blog.csdn.net/xiaoxin0630/article/details/85156543