栈
栈为后进先出:
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();
}
}