其实这个和JavaScript没有太多关系,所有的程序设计都会遇到这样的问题。就是多个操作或者运算需要按照一定的顺序依次执行,这样就需要一个队列来处理。就像在银行排队取钱一样,某一个操作需要到达队伍的最前端之后才能执行。
公司主营业务:成都网站设计、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出长垣免费做网站回馈大家。
在JavaScript中利用基础的Array对象就可以构造一个简单的队列。可以将每一次的动画效果作为一个基本元操作,每触发一次就放入队列中,如果在队列顶端那么就直接执行,否则就等待。每当一个操作执行完成之后就触发队列顶端的操作,这样就能够按照队列依次执行完毕了。
2.因为你的问题形容的比较模糊,所以补充信息给出你的答案。首先定义队列一定要说是单向循环队列,还是双向循环队列,你这里没有指出就默认是单向循环。2.1何时队列满。当新的结点进入队列的时候,那么当前的length+1当你的length=MAXlength;是代表该队列是满。2.2入队列,根据队列的定义如果入队列只能在尾巴处加入。新节点是node;node-next=rear-next;rear-next=node;2.3出队列,根据队列的定义如果出队列只能在头结点出。temp=rear-next;rear-next=rear-next-next;free(temp);3.首先假设两个栈是等长的,那么队列慢的判断条件的是两个栈中的结点和,等于一个栈的容量的时候,就代表队列满了!当两个栈不等长的时候,两个栈中的结点和等于较小的栈的长度队列就满了。以较小的栈作为队列存放栈,长的栈作为辅助栈。3.1出队列从栈顶去除结点即可。3.2入队列,将短栈内的元素,一次入长栈,然后将新元素,压入短栈,再将长栈中的元素一次入短栈。即完成了入栈。
通常它们的表现行为并不是那么地直观,而这是因为它们都处在一个单一线程中。让我们先来看一看三个用来创建以及操作timer的函数。 var id = setTimeout(fn, delay); - 初始化一个单一的timer,这个timer将会在一定延时后去调用指定的函数。这个函数(setTimeout)将返回一个唯一的ID,我们可以通过这个ID来取消timer。 var id = setInterval(fn, delay); - 与setTimeout类似,只不过它会持续地调用指定的函数(每次都有一个延时),直到timer被取消为止。 clearInterval(id);, clearTimeout(id); - 接受一个timer的ID(由上述的两个函数返回的),并且停止timer的回调事件。 (点击查看大图) 由于JavaScript向来都只能在同一时间执行一块代码(这是由它单线程的本质决定的),所以每一个代码块都阻塞了其他的异步事件。这意味着当异步事件发生时(比如鼠标点击、timer触发或者是XMLHttpRequest完成),这些事件将进入到一个队列中等待执行(队列的实现方法因浏览器而异,我们在此只讨论一个简化的情况)。 刚开始,在第一个JavaScript块中,有两个timer被初始化了:一个10ms的setTimeout和一个是10ms的setInterval。由于timer(这里的timer指setTimeout中的timer,而下文中的interval则指setInvertal中的timer)开始的时间,实际上它在第一个代码块结束前就已经触发了。然而请注意,它并不会马上执行(事实上由于单线程的存在,它也无法做到马上执行)。相反的,这个被延期执行的函数进入队列中,等待在空闲的时候被执行。 当第一个JavaScript块被执行完之后,浏览器问了一个问题:有正在等待被执行的代码吗?在这个例子中,鼠标点击事件和time事件都正在队列中等待。于是浏览器选了一个(鼠标点击事件),然后马上执行它。而timer只能继续等下去。 注意当鼠标点击事件正在执行的时候第一次的interval事件也触发了,与timer一样,它的事件也进入队列等待之后执行。然而,注意,当interval再次触发的时候(这个时候timer的事件正在执行),这一次它的事件被丢弃了。如果你在一个大的JavaScript代码块正在执行的时候把所有的interval回调函数都囤起来的话,其结果就是在JavaScript代码块执行完了之后会有一堆的interval事件被执行,而执行过程中不会有间隔。因此,取代的作法是浏览器情愿先等一等,以确保在一个interval进入队列的时候队列中没有别的interval。 让我们来看一个例子,这个例子更好地阐释了setTimeout和setInveral之间的区别。 setTimeout(function(){ /* 一个很长的代码块 */setTimeout(arguments. callee,10);},10); 我们在此学到了很多,让我们重述一下: JavaScript引擎只有一个线程,这使得异步事件必需列队等待执行。 setTimeout和 如果一个timer在将要执行的时候被阻塞,它将会等待下一个时机(比预期的延时要长)。
1.1. 队列的数据结构
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
1.2. Java实现
QueueTest
package ch04;
public class QueueTest {
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(10);
System.out.println(queue.isEmpty());
for (int i = 0; i 10; i++) {
queue.insert(i);
}
System.out.println(queue.isFull());
while (!queue.isEmpty()) {
System.out.println(queue.remove());
}
}
}
class ArrayQueue {
private int[] arrInt;// 内置数组
private int front;// 头指针
private int rear;// 尾指针
public ArrayQueue(int size) {
this.arrInt = new int[size];
front = 0;
rear = -1;
}
/**
* 判断队列是否为空
*
* @return
*/
public boolean isEmpty() {
return front == arrInt.length;
}
/**
* 判断队列是否已满
*
* @return
*/
public boolean isFull() {
return arrInt.length - 1 == rear;
}
/**
* 向队列的队尾插入一个元素
*/
public void insert(int item) {
if (isFull()) {
throw new RuntimeException("队列已满");
}
arrInt[++rear] = item;
}
/**
* 获得对头元素
*
* @return
*/
public int peekFront() {
return arrInt[front];
}
/**
* 获得队尾元素
*
* @return
*/
public int peekRear() {
return arrInt[rear];
}
/**
* 从队列的对头移除一个元素
*
* @return
*/
public int remove() {
if (isEmpty()) {
throw new RuntimeException("队列为空");
}
return arrInt[front++];
}
}
运行结果如下:
false
true
1
2
3
4
5
6
7
8
9