队列结构是从数据的元素来分类的,也就是说队列结构具有特殊的运算规则。而从数据的逻辑结构来看,队列结构其实就是一种线性结构。如果从数据的存储结构来进一步划分,队列结构包括:
class DATA4 {
String name;
int age;
}
class SQType {
static final int QUEUELEN = 15;
//队列数组
DATA4[] data = new DATA4[QUEUELEN];
//队头
int head;
//队尾
int tail;
}
顺序队列的初始化操作步骤如下:
1. 按照符号常量QUEUELEN指定的大小申请一片内存空间,用来保存队列中的数据
2. 设置head=0和tail=0,表示一个空栈
代码示例如下:
SQType SQTypeInit() {
SQType q = new SQType();
if (q != null) {
q.head = 0;
q.tail = 0;
return q;
} else {
return null;
}
}
判断队列是否为空,为空则不可以进行出队列操作,可以进行入队操作
int SQTypeIsEmpty(SQType q) {
int temp = 0;
if (q.head == q.tail) {
temp = 1;
}
return temp;
}
在程序中,根据队列head是否等于tail,判断队列是否为空
如果队列已满,表示该队列中没有多余的空间来保存额外的数据,此时不可进行入队列操作,但可以进行出队列操作
int SQTypeIsFull(SQType q) {
int temp = 0;
if (q.tail == QUEUELEN) {
temp = 1;
}
return temp;
}
void SQTypeClear(SQType q) {
q.head = 0;
q.tail = 0;
}
释放空间即释放队列结构所占用的内存单元。在初始化队列结构时,使用了new关键字分配内存空间。虽然可以使用清空队列操作,但是清空队列操作并没有释放内存空间,这里就需要使用赋值null释放所分配的内存
void SQTypeFree(SQType q) {
if (q != null) {
q = null;
}
}
入队列是队列结构的基本操作,主要操作时将数据元素保存到队列结构中。入队列操作的具体步骤如下:
1. 首先判断队尾tail,如果tail等于QUEUELEN,则表示溢出,进行出错处理;否则执行以下操作;
2. 设置tail=tail+1(队列顶引用加1,指向入队列地址);
3. 将入队列元素保存到tail指向的位置;
入队列操作示例代码:
int InSQType(SQType q, DATA4 data) {
if (q.tail == QUEUELEN) {
System.out.println("队列已满!操作失败!");
return 0;
} else {
q.data[q.tail++] = data;
return 1;
}
}
出队列是队列结构的基本操作,主要操作于入队列相反,其操作是从队头弹出一个数据元素。出队列操作的具体步骤如下:
1. 首先判断队头head,如果head等于tail,则表示为空队列,进行出错处理;否则执行以下操作;
2. 从队列首部取出队头元素(实际是返回头元素的引用);
3. 设修改队头head的序号,使其指向后一个元素;
出队列操作示例代码:
DATA4 OutSQType(SQType q) {
if (q.head == q.tail) {
System.out.println("队列已空!操作失败!");
System.exit(0);
} else {
return q.data[q.head++];
}
return null;
}
读节点数据即读取队列结构中节点的数据,这里的读操作其实就是读取队列头的数据。需要注意的是,读取节点数据的操作和出队列不同。读取节点数据的操作仅显示队列节点数据的内容,而出队列操作则将队列顶数据弹出,该数据不再存在了。
DATA4 PeekSQType(SQType q) {
if (SQTypeIsEmpty(q) == 1) {
System.out.println("空队列!");
return null;
} else {
return q.data[q.head];
}
}
int SQTypeLen(SQType q) {
int temp;
temp = q.tail - q.head;
return temp;
}
import java.util.Scanner;
class DATA4 {
String name;
int age;
}
class SQType {
static final int QUEUELEN = 15;
//队列数组
DATA4[] data = new DATA4[QUEUELEN];
//队头
int head;
//队尾
int tail;
SQType SQTypeInit() {
SQType q = new SQType();
if (q != null) {
q.head = 0;
q.tail = 0;
return q;
} else {
return null;
}
}
int SQTypeIsEmpty(SQType q) {
int temp = 0;
if (q.head == q.tail) {
temp = 1;
}
return temp;
}
int SQTypeIsFull(SQType q) {
int temp = 0;
if (q.tail == QUEUELEN) {
temp = 1;
}
return temp;
}
void SQTypeClear(SQType q) {
q.head = 0;
q.tail = 0;
}
void SQTypeFree(SQType q) {
if (q != null) {
q = null;
}
}
int InSQType(SQType q, DATA4 data) {
if (q.tail == QUEUELEN) {
System.out.println("队列已满!操作失败!");
return 0;
} else {
q.data[q.tail++] = data;
return 1;
}
}
DATA4 OutSQType(SQType q) {
if (q.head == q.tail) {
System.out.println("队列已空!操作失败!");
System.exit(0);
} else {
return q.data[q.head++];
}
return null;
}
DATA4 PeekSQType(SQType q) {
if (SQTypeIsEmpty(q) == 1) {
System.out.println("空队列!");
return null;
} else {
return q.data[q.head];
}
}
int SQTypeLen(SQType q) {
int temp;
temp = q.tail - q.head;
return temp;
}
}
public class queue {
public static void main(String[] args) {
SQType st = new SQType();
DATA4 data1;
Scanner input = new Scanner(System.in);
SQType stack = st.SQTypeInit();
System.out.println("入队列操作:");
System.out.println("输入姓名 年龄进行入队操作:");
do {
DATA4 data = new DATA4();
data.name = input.next();
data.age = input.nextInt();
if (data.name.equals("0")) {
break;
} else {
st.InSQType(stack, data);
}
} while (true);
String temp = "1";
System.out.println("出队列操作:按任意非0键进行出栈操作:");
temp = input.next();
while (!temp.equals("0")) {
data1 = st.OutSQType(stack);
System.out.println("出队列的数据是:" + data1.name + " " + data1.age);
temp = input.next();
}
System.out.println("测试结束!");
st.SQTypeFree(stack);
}
}