Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较

判断括号是否匹配:调用java本身

import java.util.Stack;
public class Solution {
   public boolean isValid(String s){
	   Stack<Character> stack=new Stack<>();
	   for(int i=0;i<s.length();i++){
		   char c=s.charAt(i);
		   if(c=='('||c=='['||c=='{')
			   stack.push(c);
		   else{
			   if(stack.empty())
				   return false;
			   char topChar=stack.pop();
			   if(c==')'&&topChar!='(')
				   return false;
			   if(c==']'&&topChar!='[')
				   return false;
			   if(c=='}'&&topChar!='{')
				   return false;
		   }
	   }
	   return stack.empty();
   }
   public static void main(String[] args){
	   System.out.println(
			   (new Solution()).isValid("(){}[]"));
	   System.out.println(
			   (new Solution()).isValid("([)]"));
   }
}

  调用自己写的:

接口:

public interface Stack<E> {
    int getSize();
    boolean isEmpty();
    void push(E e);
    E pop();
    E peek();
}

  实现方法:

public class ArrayStack<E> implements Stack<E> {
    Array<E> array;
    public ArrayStack(int capacity){
    	array=new Array<>(capacity);
    }
    public ArrayStack(){
    	array=new Array<>();
    }
    @Override
    public int getSize(){
    	return array.getSize();
    }
    @Override
    public boolean isEmpty(){
    	return array.isEmpty();
    }
    public int getCapacity(){
    	return array.getCapacity();
    }
    @Override
    public void push(E e){
    	array.addLast(e);
    }
    @Override
    public E pop(){
    	return array.removeLast();
    }
    @Override
    public E peek(){
    	return array.getLast();
    }
    @Override
    public String toString(){
    	StringBuilder res=new StringBuilder();
    	res.append("Stack:");
    	res.append("[");
    	for(int i=0;i<array.getSize();i++){
    		res.append(array.get(i));
    		if(i!=array.getSize()-1)//最后一个元素
    			res.append(",");
    	}
    	res.append("] top");
    	return res.toString();
    }
}

  队列也是一种线性结构

相比数组,队列对应的操作是数组的子集

只能从一端(队尾)添加元素,只能从另一端(队首)取出元素

public class ArrayQueue<E> implements Queue<E> {
     private Array<E> array;
     public ArrayQueue(int capacity){
    	array=new Array<>(capacity); 
     }
     public ArrayQueue(){
    	 array=new Array<>();
     }
     @Override
     public int getSize(){
    	 return array.getSize();
     }
     @Override
     public boolean isEmpty(){
    	 return array.isEmpty();
     }
     public int getCapacity(){
    	 return array.getCapacity();
     }
     @Override
     public void enqueue(E e){
    	array.addLast(e); 
     }
     @Override
     public E dequeue(){
    	 return array.removeFirst();
     }
     @Override
     public E getFront(){
    	 return array.getFirst();
     }
     @Override
     public String toString(){
    	 StringBuilder res=new StringBuilder();
 		res.append("Queue:");
 		res.append("front [");
 		for(int i=0;i<array.getSize();i++){
 			res.append(array.get(i));
 			if(i!=array.getSize()-1)//判断是否是最后一个元素
 				res.append(", ");
 		}
 		res.append("] tail");
 		return res.toString();
     }
     
     public static void main(String[] args){
    	 ArrayQueue<Integer> queue=new ArrayQueue<>();
    	 for (int i=0;i<10;i++){
    		 queue.enqueue(i);
    		 System.out.println(queue);
    		 
    		 if(i%3==2){
    			 queue.dequeue();
    			 System.out.println(queue);
    		 }
    	 }
     }
}

  

循环队列:

public class LoopQueue<E> implements Queue<E>{
	private E[] data;
	private int front,tail;
    private int size;
    
    public LoopQueue(int capacity){
    	data=(E[])new Object[capacity+1];
    	front=0;
    	tail=0;
    	size=0;
    }
    public LoopQueue(){
    	this(10);
    }
    //浪费一个元素
    public int getCapacity(){
    	return data.length-1;
    }
    @Override
    public boolean isEmpty(){
    	return front==tail;
    }
    @Override
    public int getSize(){
    	return size;
    }
    @Override
    public void enqueue(E e){
    	//判断队列是否满
    	if((tail+1)%data.length==front)
    		resize(getCapacity()*2);
    	
    	data[tail]=e;
    	tail=(tail+1)%data.length;
    	size++;
    }
    @Override
    public E dequeue(){
    	if(isEmpty())
    		throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
    	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;
    }
    @Override
    public E getFront(){
    	if(isEmpty())
    		throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
    	return data[front];
    }
    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<>();
   	 for (int i=0;i<10;i++){
   		 queue.enqueue(i);
   		 System.out.println(queue);
   		 
   		 if(i%3==2){
   			 queue.dequeue();
   			 System.out.println(queue);
   		 }
   	 }
    }
}

  

 

public class Main {
	//测试使用q运行opCount个enqueueu和dequeue操作所需要的时间,单位 秒
	private static double testQueue(Queue<Integer> q,int opCout){
      long startTime=System.nanoTime();
      Random random=new Random();
      
      for( int i=0;i<opCout;i++){
    	  q.enqueue(random.nextInt(Integer.MAX_VALUE));
      }
      for(int i=0;i<opCout;i++){
    	  q.dequeue();
      }
      long endTime=System.nanoTime();
      return (endTime-startTime)/1000000000.0;
	}
	public static void main(String[] args){
		int opCount=100000;
		ArrayQueue<Integer> arrayQueue=new ArrayQueue<>();
		double time1=testQueue(arrayQueue, opCount);
		System.out.println("ArrayQueue,time: "+time1+" s");
		
		LoopQueue<Integer> loopQueue=new LoopQueue<>();
		double time2=testQueue(loopQueue, opCount);
		System.out.println("ArrayQueue,time: "+time2+" s");
	}	 
}

 

 

posted @ 2019-03-17 21:29  石shi  阅读(676)  评论(0编辑  收藏  举报