数据结构(Java笔记)—队列(顺序队列)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40780805/article/details/82814990

队列(Queue)——先进先出线性表,队列结构具有特殊的运算规则,从数据的逻辑结构来看,队列结构是一种线性表;从数据的存储结构来看,队列结构分为顺序队列结构和链式队列结构;

  • 顺序队列结构:使用一组地址连续的内存单元依次保存队列中的数据。
  • 链式队列结构:使用链表形式保存队列中各元素的值。

从上图中可以看出,在队列结构中允许对两端进行操作,但两端的操作不同,只能在表的一端进行删除,称为队头;在表的另一端进行插入,称为队尾,如果队列中没有数据元素,称为空队列。

队列中常用的操作:


  • 入队列:将一个元素添加到队尾(相当于到队列最后排队等候)。

  1. 首先判断队尾(tail),tail等于MSXLEN(队列结构数组最大长度)表示溢出,进行错误处理,否则进行下一步。
  2. 将入队列元素保存到tail指向的位置;
  3. 设置队尾tail=tail+1

  • 出队列:将队头的元素取出,同时删除该元素,使后一个元素成为队头。
  1. 首先判断队头(head),head等于tail表示空队列,进行错误处理,否则进行下一步。
  2. 从队列首部取出队头元素(实际是返回队头元素的引用)。
  3. 修改队头head=head+1

对顺序队列的设计步骤:

  1. 定义队列结构(QueueType)
  2. 初始化队列(queueInit)
  3. 计算队列大小(queueLen)
  4. 入队列(queueAdd)
  5. 出队列(queueOut)

代码实现:

一,定义结点

public class Data {//定义结点
	String name;
	int age;
}

二,实现队列结构

public class Queue {
	QueueType qt;//定义全局头引用
	
	class QueueType{//定义队列结构
		static final int MAXLEN=20;
		Data[] data=new Data[MAXLEN];
		int head;//队头
		int tail;//队尾
	}
	
	void queueInit(){//初始化队列结构
		if((qt=new QueueType())!=null){
			qt.head=0;
			qt.tail=0;
		}
	}
	
	int queueLen(){//计算队列中元素的个数
		return qt.tail-qt.head;
	}
	
	int queueAdd(Data d){//入队列
		if(qt.tail>=qt.MAXLEN){
			System.out.print("队列溢出!");
			return 0;
		}
		qt.data[qt.tail++]=d;
		return 1;
	}
	
	Data queueOut(){//出队列
		if(qt.head==qt.tail){
			System.out.print("队列为空!");
			return null;
		}
		return qt.data[qt.head++];
	}
}

三,运行测试

public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		Queue dt = new Queue();
		dt.queueInit();
		while (true) {
			System.out.println("请输入:0(退出),1(入队列),2(出队列),3(队列大小)");
			int i = in.nextInt();
			switch (i) {
			case 0:
				return;
			case 1:
				Data d = new Data();
				System.out.print("添加姓名:");
				String name = in.next();
				System.out.print("添加年龄:");
				int age = in.nextInt();
				if (name == null || age == 0) {
					System.out.println("信息不能为空");
					break;
				}
				d.age = age;
				d.name = name;

				int temp1 = dt.queueAdd(d);
				if (temp1 == 0) {
					System.out.println("入队失败");
					break;
				}
				System.out.println("入队成功");
				break;
			case 2:
				Data data = dt.queueOut();
				if (data == null) {
					System.out.println("出队失败");
					break;
				}
				System.out.println("出队成功");
				System.out.println("姓名:" + data.name + "" + "年龄:" + data.age);
				break;
			case 3:
				System.out.println("栈的大小为:" + dt.queueLen());
				break;
			default:
				break;
			}
		}
	}

猜你喜欢

转载自blog.csdn.net/qq_40780805/article/details/82814990