如何获取循环队列中,某个元素的前方元素总数?

 

结论:

    某元素前方的个数 = (元素index - 首指针  + 数组长度)% 数组长度

和求元素的总数思路一样,你可以认为求当前元素的前方元素(不包含当前元素)的个数, 即为求尾指针rear = index时的元素个数,而这就是求元素总数. 

换句话说, 我就是想知道插入index元素的时候的总数(就算有出队操作).

尾指针指向最后插入元素的下一个位置,在我的循环队列中留一个位置用以判断队满.

 

图示:

                          

JAVA 实现:

循环队列类.

package run;

public class Queue {
	private static int MAXLen = 10;  //队列长度
	
	private int front ; //指向队头
	
	private int rear;  //指向队尾的下一个位置。

	private int num; //当前元素数量
	private Object queueList[];
	public Queue() {
		this(MAXLen);
	}
	public Queue(int MaxLen) {
		queueList = new Object[MaxLen];
	}
	/**判空 */
	public boolean isEmpty() {   
		if(front == rear) {
			return true;
		}
		return false;
	}
	/**判满 */
	public boolean isFull() {  
		if(front==(rear+1)%queueList.length) { // 0 == (2+1) % 3==0			
			System.out.println("队列已满");
			return true;
		}
		return false;
	}
	/**添加元素*/
	public boolean enqueue(Object obj) {
		if(isFull()) {	
			return false;
		}
		queueList[rear]=obj;
		System.out.println("添加的对象为:"+obj.toString());
		rear = (rear+1)%queueList.length;
		num ++;
		return true;
	}
	/**取出头部元素   注意非空判断*/
	public Object dequeue() {
		if(isEmpty()){
			return null;  
		}	
		Object o = queueList[front];
		//queueList[front] =null;
        front=(front+1)%queueList.length;
        num--;
        return o;
	}
	/**获得队列已有元素总数*/
	public int getNum() {
		return num;
	}
	/**获取头指针*/
	public int getFront() {
		return front;
	}
	/**获取尾指针*/
	public int getRear() {
		return rear;
	}
	/**获取指定元素的前面元素总数*/
	public int getYourFront(Object obj) {
		int index = getYourIndex(obj);
		if(index==-1) {
			return 0;
		}
		int numbers = (index-this.front+Queue.MAXLen)% Queue.MAXLen;
		return numbers;	
	}
	/**获取指点元素的下标**/
	public int getYourIndex(Object obj) {
		int index=getIndex(queueList,obj);
		return index;	
	}
	public static int getIndex(Object[] arr, Object value) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i].equals(value)) {
                return i;
            }
        }
        return -1;//如果未找到返回-1
    }

}

主函数

package run;


public class test {

	public static void main(String[] args) {
		Queue que = new Queue();	
    	        que.enqueue("1");
    	        que.enqueue("2");
    	        que.enqueue("3");
    	        que.enqueue("4");
    	        //队列中剩余
    	        que.enqueue("5");
    	        que.enqueue("6");
    	        que.enqueue("7");
    	        que.enqueue("8");
    	        que.enqueue("9");
    	        que.enqueue("10"); //满
    	        System.out.println("取出头对象:"+que.dequeue().toString());
		System.out.println("取出头对象:"+que.dequeue().toString());
		System.out.println("取出头对象:"+que.dequeue().toString());
		System.out.println("取出头对象:"+que.dequeue().toString());
		A a = new A();
		a.setName("xiong");
		a.setPassword("aaa");
		a.setSex("222");
		A b = new A();
		b.setName("xiong");
		b.setPassword("bbbbb");
		b.setSex("222");
		A C = new A();
		C.setName("JJJJJJ");
		C.setPassword("cccc");
		C.setSex("222");
		que.enqueue(a);
		que.enqueue(b);
		System.out.println("队列总数:"+que.getNum());
		System.out.println("首指针:"+que.getFront());
		System.out.println("尾指针:"+que.getRear());
		//获取元素前面的位置
		System.out.println("a对象的位置是:"+que.getYourIndex(a));
		System.out.println("a对象前方元素个数:"+que.getYourFront(a));
		System.out.println("b对象的位置是:"+que.getYourIndex(b));
		System.out.println("b对象前方元素个数:"+que.getYourFront(b));
		System.out.println("c对象的位置是:"+que.getYourIndex(C));
		System.out.println("C对象前方元素个数:"+que.getYourFront(C));
		System.out.println("9 的位置是"+que.getYourIndex("9"));
		System.out.println("9对象前方元素个数:"+que.getYourFront("9"));
	}

}

结果展示 

                                                 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值