数据结构重温之队列篇
在程序设计中,队列结构也是一种常用的数据结构。队列结构和栈结构类似,其在现实生活中都有对应的例子,可以说队列结构是来源于生活的数据结构。
什么是队列结构
队列结构是从数据的运算来分类的,也就是说队列结构具有特殊的运算规则。而从数据的逻辑结构来看,队列结构 其实就是一种线性结构。如果从数据的存储结构来进一步划分,队列包括以下两类。
1.顺序队列结构:即使用一组地址连续的内存单元依次保存队列中的数据。在程序中,可以定义一个指定大小的结构数组作为队列。
2.链式队列结构:即使用链表形式保存队列中各元素的值。
从数据的运算角度来分析,队列结构是按照“先进先出”(即First In First Out, FIFO)的原则处理结点数据的。
在队列结构中,数据运算非常简单。一般队列结构的基本操作只有两个。
1.入队列:将一个元素添加到队尾(相当于到队列最后排队等候)。
2.出队列:将队头的元素取出,同时删除该元素,使后一个元素成为队头。
下面的代码为基本的队列操作,供大家参考。
package com.january.daily.queue;
class DATA{
String name;
int age;
public DATA(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
public class SQType {
static final int QUEUE_LENGTH = 15;
DATA[] data = new DATA[QUEUE_LENGTH];
int head;//队头
int tail;//队尾
@SuppressWarnings("unused")
SQType SQTypeInit(){
SQType q;
if ((q = new SQType())!=null) {
q.head = 0;
q.tail = 0;
return q;
}else {
return null;
}
}
/**
* 判断队列是否为空
* @param q
* @return
*/
boolean SQTypeIsEmpty(SQType q){
if (q.head == q.tail) {
return true;
}
else
{
return false;
}
}
/**
* 判断队列是否已满
* @param q
* @return
*/
boolean SQTypeIsFull(SQType q){
if (q.tail == QUEUE_LENGTH) {
return true;
}
else
{
return false;
}
}
/**
* 清空队列
* @param q
*/
void SQTypeClean(SQType q){
q.head = 0;
q.tail = 0;
}
/**
* 释放内存
* @param q
*/
void SQTypeFree(SQType q){
if (q!=null) {
q = null;
}
}
/**
* 入队列操作
* @param q
* @param data
* @return
*/
int InSQType(SQType q,DATA data){
if (SQTypeIsFull(q)) {
System.out.println("队列已满!");
return 0;
}
else
{
//将元素加入队列
q.data[q.tail++]=data;
return 1;
}
}
/**
* 出队列
* @param q
* @return
*/
DATA OutSQType(SQType q){
if (SQTypeIsEmpty(q)) {
System.out.println("队列为空!");
return null;
}
else
{
return q.data[q.head++];
}
}
/**
* 从队列中读取数据
* @param q
* @return
*/
DATA PeekSQType(SQType q){
if (SQTypeIsEmpty(q)) {
System.out.println("队列为空!");
return null;
}
else
{
return q.data[q.head];
}
}
/**
* 获取队列的长度
* @param q
* @return
*/
int SQTypeLen(SQType q){
int temp;
temp = q.tail - q.head;
return temp;
}
public static void main(String[] args) {
SQType st = new SQType();
DATA data1 = new DATA("张三", 20);
DATA data2 = new DATA("李四", 22);
DATA data3 = new DATA("王五", 23);
SQType sqTypeInit = st.SQTypeInit();
st.InSQType(sqTypeInit, data1);
st.InSQType(sqTypeInit, data2);
st.InSQType(sqTypeInit, data3);
System.out.println("入队列成功!");
while (true) {
DATA outSQType = st.OutSQType(sqTypeInit);
if (outSQType!=null) {
System.out.println("出队列的数据为:"+outSQType.name+" "+outSQType.age);
}
else
{
break;
}
}
st.SQTypeClean(sqTypeInit);
}
}