JAVA数据结构之 栈和队列

版权声明:聂CC~ https://blog.csdn.net/ncc1995/article/details/87432051

栈为后进先出:

isFull()判断栈是否已满,isEmpty()判断栈是否为空:

设置一个变量nitems,

当nitems=MaxSize时,即为满;

当nitems=0时,即为空;

push()入栈函数:

先判断栈是否已满,再将数据入栈;

pop()出栈函数:

先判断栈是否为空,再进行出栈操作。

--------------------------------------------------------------------------------------------------

数组初始化操作:stackArray = new Object[MaxSize];

top指向栈顶,初始化为-1,入栈时先执行top++,再入栈;出栈时先出栈,再执行top--。

public class stack {
	int top;
	int items;
	int MaxSize;
	Object stackArray[];
	
	public stack(int size) {
		top = -1;
		items = 0;
		MaxSize = size;
		//数组初始化
		stackArray = new Object[MaxSize];
	}
	
	public void push(Object data) {
		
		if(isFull()) {
			System.out.println("The stack is full");
		}else {
			top++;
			stackArray[top] = data;
			items++;
		}
	}
	
	public Object pop() {
		Object p = null;
		if(isEmpty()) {
			System.out.println("The stack is empty");
		}else {
			p = stackArray[top];
			top--;
			items--;
		}
		return p;
	}
	
	public boolean isEmpty() {
		return (items == 0);
	}
	
	public boolean isFull() {
		return (items == MaxSize);
	}
	
	public void display() {
		int n = 0;
		while(n<items) {
			System.out.print(stackArray[n++] + " ");
			
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		int size = 5;
		stack s = new stack(size);
		
		s.push(11);
		s.push(233);
		s.push(37);
		s.push(4);
		s.push(8);
		s.display();
		s.pop();
		s.pop();
		s.pop();

		s.display();
	}
}

队列 

队列为先进先出:

isFull();

isEmpty();

insert();

remove();

判断方法和stack一样。

--------------------------------------------------------------------------------------------

有front和rear两个指针,一个指向队头,一个指向队尾。

初始化,保证front一直指向队头,rear一直指向队尾:

front=0;

rear=-1;

该队列的缺点:如果一直执行remove()函数,队列前面的位置会一直为空,浪费了空间,所以等下会介绍一下循环队列。


public class queue {
	int MaxSize;
	int items;
	int front;
	int rear;
	Object queueArray[];
	
	public queue(int size) {
		MaxSize = size;
		items = 0;
		front = 0;
		rear = -1;
		
		queueArray = new Object[MaxSize];
	}
	
	public void insert(Object data) {
		if(isFull()) {
			System.out.println("the queue is full");
		}else {
			queueArray[++rear] = data;
			items++;
		}
	}
	
	public Object remove() {
		Object p = null;
		if(isEmpty()) {
			System.out.println("the queue is empty");
		}else {
			p = queueArray[front++];
			items--;
		}
		return p;
	}
	
	public Object peek() {
		Object p = null;
		
		return p;
	}
	
	public boolean isEmpty() {
		return(items == 0);
	}
	
	public boolean isFull() {
		return(items == MaxSize);
	}
	
	public void display() {
		System.out.println(items);
		int n = front;
		while(n<items+front) {
			System.out.print(queueArray[n++] + " ");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		int size = 5;
		queue q = new queue(size);
		
		q.insert(33);
		q.insert(28);
		q.insert(23);
		q.insert(4);
		q.insert(55);
		q.display();
		q.remove();
		q.remove();
		q.display();
		
	}
}

循环队列

当队列的front和rear指向队尾的时候,就将指针重新指向队头。

指向队尾的判断:

rear = maxSize-1;

front = maxSize;

初始化:

front=0;

rear=-1;

	public Object remove() {
		Object p = null;

		
		if(isEmpty()) {
			System.out.println("the queue is empty");
		}else {
			p = queueArray[front++];
			items--;
		}
		if(front == MaxSize) {
			front = 0;
		}
		return p;
	}

关于上面这段代码,对front的判断问题:

先执行出队列操作再判断的时候,front在指向队尾后立马指向队头,所以它的值只包括0......maxSize-1的数值;

而先判断再进行出队列操作的话,front在指向队尾后值会变成maxSize,在执行下一次的移除操作时,在判断语句里front变成0,在移除操作里,front的值又紧接着变成1,执行remove()时将不会显示front等于0的过程了。

以上两种实现方式,结果都是正确的,但是第一种明显更直观,更符合我们的思考。

----------------------------------------------------------------------------------------


public class cirQueue {
	int MaxSize;
	int items;
	int front;
	int rear;
	Object queueArray[];
	
	public cirQueue(int size) {
		MaxSize = size;
		items = 0;
		front = 0;
		rear = -1;
		
		queueArray = new Object[MaxSize];
	}
	
	public void insert(Object data) {
		if(rear == MaxSize-1) {
			rear = -1;
		}
		if(isFull()) {
			System.out.println("the queue is full");
		}else {
			queueArray[++rear] = data;
			items++;
		}
	}
	
	public Object remove() {
		Object p = null;

		
		if(isEmpty()) {
			System.out.println("the queue is empty");
		}else {
			p = queueArray[front++];
			items--;
		}
		if(front == MaxSize) {
			front = 0;
		}
		return p;
	}
	
	public Object peek() {
		Object p = null;
		
		return p;
	}
	
	public boolean isEmpty() {
		return(items == 0);
	}
	
	public boolean isFull() {
		return(items == MaxSize);
	}
	
	public void display() {
		
		System.out.println();
	}
	
	public static void main(String[] args) {
		int size = 3;
		cirQueue q = new cirQueue(size);
		
		q.insert(33);
		q.insert(28);
		q.insert(23);

		q.remove();
		q.remove();
		
		
		q.insert(22);
		q.insert(98);
		
		q.remove();
		q.remove();
		Object n = null;
		while(!q.isEmpty()) {
			n = q.remove();
			System.out.print(n + " ");
		}
		System.out.println();

	}
}

猜你喜欢

转载自blog.csdn.net/ncc1995/article/details/87432051