js实现队列的操作以及对队列中数字的冒泡排序的可视化

一.理论基础

(1)封装一个对队列操作的构造函数,可以进行进队列,出队列,获得队列长度,返回该队列的数组形式。

(2)使用正则表达式对input框中的输入字符进行验证,并获得有效的值

(3)使用setInterval()定时器实现可视化的冒泡排序过程,(因为js中没有sleep()函数),使用两个嵌套if语句控制排序过程,外部if语句表示执行次数,内部if语句进行相邻两个数的比较,每两个相邻数字,通过比较,交换完之后,绘制一次图形,j++,然后通过定时器继续执行函数,当一次的相邻数字比较完之后,一个数字冒泡出来,i++,此时内部j=0,继续执行定时器函数,如此反复,直到i=数组的长度,定时器清除掉。

二。html部分

<body>
	<fieldset>
    <legend>队列进出操作,并对数字进行排序,对列中的数量不超过60个</legend>    
    <label>请在文本框中输入数字<input type="text" id="num" class="form-control"></label>
    <button id="leftRu">左侧入</button>
    <button id="rightRu">右侧入</button>
    <button id="leftChu">左侧出</button>
    <button id = "rightChu">右侧出</button>  
    <button id = "bubbleSort">冒泡排序</button>
    <button id = "randomNum">随机生成数据</button>        
  </fieldset>
  <div id= "queue"></div>
  <script src="task19.js"></script>
</body>
</html>

三。js部分

//跨浏览器事件绑定
function addEventHandler(ele, event, hanlder) {
    if (ele.addEventListener) {
        ele.addEventListener(event, hanlder, false);
    } else if(ele.attachEvent) {
        ele.attachEvent("on"+event, hanlder);
    } else {
        ele["on" + event] = hanlder;
    }
}

//实现对列的构造函数
function Queue(){
	var items = [];

	this.Lenqueue = function(element){
		items.unshift(element);
	};

	this.Renqueue = function(element){
		items.push(element);
	};

	this.Ldequeue = function(){
		items.shift();
       
	};

	this.Rdequeue = function(){
		items.pop();
       
	};
	this.size = function(){
		return items.length;
	};
	this.print = function(){
		return items;
	}
}

var leftRu = document.getElementById(‘leftRu‘);
var rightRu = document.getElementById(‘rightRu‘);
var queueDiv = document.getElementById(‘queue‘);
var leftChu = document.getElementById(‘leftChu‘);
var rightChu = document.getElementById(‘rightChu‘);
var bubblesort = document.getElementById(‘bubbleSort‘); 
var randomNum = document.getElementById("randomNum");
var input = document.getElementById(‘num‘);

//绑定事件
    addEventHandler(leftRu,‘click‘, enqueueleftRu);
    addEventHandler(rightRu,‘click‘, enqueuerightRu);
    addEventHandler(leftChu,‘click‘, enqueueleftChu);  
    addEventHandler(rightChu,‘click‘, enqueuerightChu);
    addEventHandler(bubblesort,‘click‘, Bubblesort);
    addEventHandler(randomNum,‘click‘, randomNUM);

var queue = new Queue();//实例化一个对象实例

//获得input中的值
function getInputValue(){
	var input = document.getElementById(‘num‘);
	var inputValue = input.value.trim();
	if(inputValue.match(/^[1-9][0-9]$/)){
		   return inputValue;
		}
	else{
			alert("请输入10-100之间的整数!");

		}
}
//可视化队列数据
function viewData(showArr){
	var text="",color="#33eee2";
	for(var i=0;i<showArr.length;i++){
	   /* color = ‘#‘ + Math.floor(Math.random() * 0xFFFFFF).toString(16);*/	  
		text+="<div style = ‘background-color:"+color+";height:"+showArr[i]*5+"px;‘>"+showArr[i]+"</div>";
	}
	queueDiv.innerHTML="";
	queueDiv.innerHTML=text;   
	document.getElementById(‘num‘).value=""; 

}

//左入
function enqueueleftRu(){
	var inputValue = getInputValue();
       if(inputValue){
        	if(queue.size()<60){
       		queue.Lenqueue(inputValue);       	 
	         viewData(queue.print());
        	}
        	else{
        		alert("您队列中的数量已经超过60个了");
        	}
       	  
       }
		else{
            input.focus();
		}

} 
//右入
function enqueuerightRu(){	

	var inputValue = getInputValue();
      if(inputValue){
       	  queue.Renqueue(inputValue);       	 
	      viewData(queue.print());
       }
		else{
            input.focus();
		}

	  

} 
//左出
function enqueueleftChu(){

       	  queue.Ldequeue();       	 
	      viewData(queue.print()); 

} 
//右出
function enqueuerightChu(){	

	queue.Rdequeue();
	viewData(queue.print());		

} 

//随机生成数据
function randomNUM(){
   var data = [];
	for(i=0;i<=10;i++){
			data[i]=Math.floor(Math.random()*20+10);
			queue.Renqueue(data[i]);

		}
		viewData(queue.print());
}

/*
  冒泡排序任何相邻俩个的项,如果第一个比第二个大,则交换他们。
  */
function Bubblesort(){
   var i = 0,j = 0;
   var temp;
   var data =  queue.print();   
   var len = queue.size();
   var timer = null;
   //用计数器实现一步步展示效果
	  timer = setInterval(run,1000);
		function run() {
			if (i < len) {
				if (j < len-1-i) {
					if (data[j] > data[j+1]) {
						temp = data[j];
						data[j] = data[j+1];
						data[j+1] = temp;
						viewData(data);
					}
					j++;
				} else {//内层循环一次完,外层循环i++
					i++;
					j = 0;
				}
			} else {
				clearInterval(timer);
				return;
			}
		}	

	}

四。效果图

(1)输入一组数据,15,14,13,12,11,进行右边进队列,如图:

(2)点击冒泡排序,变化过程如下:

五。后期会继续完成各个排序的简单可视化效果

时间: 2024-08-29 23:09:51

js实现队列的操作以及对队列中数字的冒泡排序的可视化的相关文章

Exchange 2013/2016邮件队列重播操作

我们经常遇到需要将传输队列中的邮件进行重播的情况,下面简单介绍如何操作: Exchange传输邮件是先应用程序将需要发送的邮件进行一个格式转换,转换为eml格式的文本文件,然后又Pickup(分拣程序)将.eml文件放置在C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Pickup目录下,然后又SMTP入站服务器将邮件提交道SMTP服务数据库中进行传输.需要注意eml文件必须满足如下要求: 1).仅仅只有扩展名称为.em

php中对共享内存,消息队列的操作

http://www.cnblogs.com/fengwei/archive/2012/09/12/2682646.html php作为脚本程序,通常生命周期都很短,如在web应用中,一次请求就是php运行的 一个周期,请求结束则生命周期截止.所以php在处理需要共 享的资源时,一般会将共享数据保存在数据库或dbm之类的文件中,再者就是利用内存实现共享.你可以选择已有的工具辅助你,像memcache:也可以自 己编写代码访问操作系统的共享内存段. php中对共享内存段的操作有两组函数:Syste

JAVA基础知识(2)--队列的操作

队列是一种线性表,它只允许在该表中的一端插入,在另一端删除. 允许插入的一端叫做队尾(rear),允许删除的一端叫做队头(front): 下面用Java的数组进行模拟队列的操作: /**2015-07-26 18:49:08 *用数组元素来演示队列的内部操作 *@author lihaiming *Email:[email protected] */import java.util.Scanner; public class Queue { //属性变量 private int[] a; pri

php+redis队列链表操作类

php redis队列处理 /** * 队列链表操作类 * */ class QueueModel extends BaseModel { public $redisHandler; //redis 句柄 const QUEUE_LIST_KEY='article_list_queue'; //队列保存键名 const QUEUE_LIST_LEN='article_list_length';//队列长度保存键名 const QUEUE_LIST_LEN_CACHE_TIME=3600; //队

数据结构-单链队列相关操作算法

#include <stdio.h>#include <stdlib.h> #define OVERFLOW -2#define OK 1#define ERROR 0 typedef int QElemType; //单链队列结构体定义typedef struct QNode {    QElemType data;    struct QNode *next;}QNode,*QueuePtr;typedef struct {    QueuePtr front;    Queu

Java操作RabbitMQ添加队列、消费队列和三个交换机

一.发送消息到队列(生产者) 新建一个maven项目,在pom.xml文件加入以下依赖 <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>3.6.5</version> </dependency> </dependencies>

bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换*&amp;&amp;bzoj1692[Usaco2007 Dec]队列变换*

bzoj1640[Usaco2007 Nov]Best Cow Line 队列变换 bzoj1692[Usaco2007 Dec]队列变换 题意: 有一个奶牛队列.每次可以在原来队列的首端或是尾端牵出一头奶牛,把她安排到新队列的尾部,然后对剩余的奶牛队列重复以上的操作,直到所有奶牛都被插到了新的队列里.这样得到的队列,就是FJ拉去登记的最终的奶牛队列. 求对于给定的奶牛们的初始位置,计算出可能得到的字典序最小的队列.队列大小≤30000. 题解: 有一个结论:如果当前队列中的队首元素不等于队尾元

IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)

进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispatch_queue_t,队列名称在调试时辅助,无论什么队列和任务,线程的创建和回收不需要程序员操作,有队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispatch_queue_t q = dispatch_queue_create(“....”, DISPATCH_QUEUE_SER

队列的应用:优先级队列

优先级队列:如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了. 优先级队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素(3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 .对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行. 以上是网上常见的对优先级队列的描述.偷