一。昨日TX又推出了一款手机软件‘微信’,不过现在貌似只能在智能机上使用,如iPhone,Android等平台,它的一大特点是‘零资费发短信’,因为传统在手机上发短信都是按短信条数计费或者按短信套餐计费,不过使用‘微信’发短信是按照流量来计费,这样算起来,1M的流量就完全可以发几千条短信了。关于‘微信’,大概只知道这些,继续关注,应该会有很不错的商业模式。
二。在这里,推荐一部电影《社交网络》。大家应该很熟悉facebook,也对马克`扎克伯格不会陌生,facebook是现今一家发展迅速,注册人数不断飙升的社交网站即SNS(SNS是一个很火的概念),而扎克伯格则是世界上最年轻的亿万富翁(年仅26),被称为‘盖茨第二’,之前扎克伯格也是低调访华,分别造访了百度的李彦宏,中国移动的掌门人等,不知这次低调访华意味着什么,进军中国市场?可能吧。但现在facebook现在还得fan才能进去呢。就像之前的一个新闻‘貌似是先前塔吉克斯坦归还我国领土1000平方公里,而最悲哀的莫过于,这之上的居民就突然没办法上facebook,twitter,youtube等一系列网站了’。回到正题,影片应该属于一个叙事性的拍摄方法,只不过手法是属于倒叙,整部影片基本讲述了facebook的创作历程以及一些小插曲。
三。春运已至,火车站也开始火爆起来了,之前在火车站排队买票,队伍基本已经排到马路上来了,不得不质疑铁路局每年承诺的所谓改善售票状况及提高铁路运营效率是何物。排队,在数据结构上来说属于‘队列’,一般‘队列’都是用于对现实状况的一个仿真,比如有情景‘N个售票口,每个人售票时间是T以及其他的一些因素’,然后对其情景实现计算机仿真,貌似先前08年奥运会就大量使用了仿真,以确保遇到突发情况有一个预先处理。
四。队列,经典定于为‘先进先出,后进后出’即‘First In First Out’和‘Last In Last Out’,联想一下排队的情形很快就可以了,在操作系统上的调动算法其中有一个是‘FCFS’即‘First Come First Serve’,应该来说是一个比较简单的调度算法,没有考虑其他比如进程的消耗时间多少等其他因素,队列在数据结构上有链队列(链式映像),循环队列(顺序映像),即完全可以使用链表(LinkedList)和数组表(ArrayList)进行实现。
五。贴代码:
package com.ds.test4;
public class ArrayQueue<E> {
private ArrayList<E> arrayList = null;
private E front = null; //头指针
private E rear = null; //尾指针
private int index = -1; //索引
public ArrayQueue(){
arrayList = new ArrayList<E>(); //初始化
}
public synchronized boolean enQueue(E e){ //入队操作
index++; //索引增加
if(index == 0){
front = e; //第一次入队,使front指向第一个元素
}
arrayList.add(e); //加入元素
rear = e; //使rear永远指向最新加入的元素
return true;
}
public synchronized E deQueue(){ //出队操作
if(index == 0){ //当是最后元素出队时,头指针和尾指针设为空
front = null;
rear = null;
}
checkIndex(); //检查索引
index--; //索引减一
return arrayList.remove(0); //remove第一个元素
}
public E front(){ //取得头指针指向的元素
checkIndex();
return front;
}
public E rear(){ //取得尾指针指向的元素
checkIndex();
return rear;
}
private void checkIndex(){ //检查索引
if(index == -1){
throw new RuntimeException("没有元素");
}
}
public int size(){
return index+1;
}
}
链队列即LinkedQueue
package com.ds.test4;
public class LinkedQueue<E> {
private LinkedList<E> linkedList = null;
private E front = null; //头指针
private E rear = null; //尾指针
private int index = -1; //索引
public LinkedQueue(){
linkedList = new LinkedList<E>(); //初始化
}
public synchronized boolean enQueue(E e){ //入队操作
index++; //索引增加
if(index == 0){
front = e; //第一次入队,使front指向第一个元素
}
linkedList.add(e); //加入元素
rear = e; //使rear永远指向最新加入的元素
return true;
}
public synchronized E deQueue(){ //出队操作
if(index == 0){ //当是最后元素出队时,头指针和尾指针设为空
front = null;
rear = null;
}
checkIndex(); //检查索引
index--; //索引减一
return linkedList.remove(0); //remove第一个元素
}
public synchronized boolean insertQueue(int where,E e){//果断插队
linkedList.insert(where, e);
index++;
return true;
}
public E front(){ //取得头指针指向的元素
checkIndex();
return front;
}
public E rear(){ //取得尾指针指向的元素
checkIndex();
return rear;
}
private void checkIndex(){ //检查索引
if(index == -1){
throw new RuntimeException("没有元素");
}
}
public int size(){
return index+1;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
for(int i = 0;i<=index;i++){
sb.append(i+"-"+linkedList.get(i)+",");
}
sb.deleteCharAt(sb.length()-1);
return sb.toString();
}
}
六。sun的java源码在此从略。
(1)sun有ArrayDeque和PriorityQueue。ArrayDeque应该就是循环队列,而PriorityQueue没有仔细学习,所以留待以后再深入。
(2)应该来说使用java实现队列还是难度不是很大,而使用C语言考虑的东西就会多一些,比如指针这个令无数人头疼的东西,可能是对C语言不太熟悉,对于很多技术都很难有有深度的理解,听过一句话‘java是面向对象,而C语言是面向内存’,嗯,鉴于此,以后挑一个时间一定得熟悉下C。
七。此次编码不算复杂,主要是都是基于先前自己实现的ArrayList和LinkedList编码。队列经典操作为enQueue (入队),deQueue(出队)和insertQueue(插队)。严蔚敏的C语言版本的《数据结构》堪为经典,但囿于不熟悉C语言,很多细节无法深入,比如队列这一章关于循环队列的‘假溢出’现象,很是遗憾,所以再三提醒自己:有时间一定得拿起C语言。毕竟C语言与数据结构是相辅相成的两样经典。
八。总结:学的越多,越发现自己懂的越少。