数据结构——栈
队列和栈都是输出输入受限的线性表
特点:先进后出
栈是限制线性表中元素的插入和删除,上述操作只能在线性表的同一端进行的一种特殊的线性表就是栈,允许插入和删除的一端,为变化端,称为栈顶,另一端固定一端,称为栈底
判断栈满,top和maxSize-1指向的位置一样
package com.qcby.datastructure;
public class Stack {
//定义数组
private int[] arr;
//栈的大小
private int maxSize;
//表达栈顶(初始没值,为-1)---指向最后一个有效元素
private int top =-1;
//初始化
public Stack(int maxSize) {
this.maxSize = maxSize;
this.arr =new int[maxSize];
}
//栈满
public boolean isFull(){
return top==maxSize-1;
}
//栈空
public boolean isEmpty(){
return top==-1;
}
//入栈
public void push(int num){
if (isFull()){
System.out.println("栈满了,考虑扩容");
return;
}
top++;
arr[top]=num;
}
//出栈
public int pop(){
if (isEmpty()){
//空了要终止函数,用return不太合适,因为这是有类型的函数,所以通过异常抛出
throw new RuntimeException("栈是空了,没有数据");
}
int res =arr[top];
top--;
return res;
}
//显示栈,从栈顶开始显示元素
public void list(){
if (isEmpty()){
//空了要终止函数,用return不太合适,因为这是有类型的函数,所以通过异常抛出
throw new RuntimeException("栈是空了,没有数据");
}
for (int i=top;i>=0;i--){
System.out.println(arr[i]);
}
}
}
数据结构——队列
特点:先进先出
队列是限制线性表中元素的插入和删除,上述操作只能在线性表的同一端进行的一种特殊的线性表就是队列
队列使用数组来实现,因为队列的出队、入队是分别从头、尾端来处理的,因此需要两个变量front和rear(分别指向头尾)
front会随着数据的出队而变化,而rear会随着数据入队而变化
如果尾指针rear小于maxSize-1,就可以往后移动,然后把数据存在当前rear指向的数组元素上。
当rear =maxSize-1,队列满
当front==rear 队列空
package com.qcby.datastructure;
public class Queue {
//定义数组
private int[] arr;
//队列的大小
private int maxSize;
//队头“指针”
private int front;
//队尾“指针”
private int rear;
//初始化
public Queue(int maxSize) {
this.maxSize = maxSize;
arr =new int[this.maxSize];
front =-1;
rear =-1;
}
//队满
public boolean isFull(){
return rear==maxSize-1;
}
//队空
public boolean isEmpty(){
return rear==front;
}
//入队
public void add(int value){
if (isFull()){
System.out.println("队满,考虑扩容");
return;
}
rear++;
arr[rear]=value;
}
//出队
public int remove(){
if (isEmpty()){
throw new RuntimeException("队空,没有数据");
}
front++;
return arr[front];
}
//显示队列
public void list(){
if (isEmpty()){
throw new RuntimeException("队空,没有数据");
}
for (int i=front+1;i<=rear;i++){
System.out.println("queen:"+"["+i+"]:"+arr[i]);
}
}
}