引用类型,js计算两个时间之间的天数差

关于引用类型的定义:

1 #include <iostream>
  2
  3 #define MAXN  100
  4 using namespace stbd;
  5
  6
  7 struct BTNode
  8 {
  9     char tag;
10     BTNode *left;
11     BTNode *right;
12 };
13
14 class BTree
15 {
16 private:
17     BTNode **root;
18     void BuildBTree(BTNode **root);
19
20 public:
21     /*递归版本*/
22     void PreVisit(BTNode *root);
23     void InVisit(BTNode *root);
24     void PostVisit(BTNode *root);
25
26     /*非递归版本*/
27     void NR_PreVisit(BTNode *root);
28     void NR_InVisit(BTNode *root);
29     void NR_PostVisit(BTNode *root);
30
31     BTree(BTNode **r);
32     BTree();
33 };
34
35 BTree::BTree()
36 {
37
38 }
39
40 BTree::BTree(BTNode **r)
41 {
42     root = r;
43     /*
44 *root = new BTNode; 45     (*root)->left = NULL;
46 (*root)->right = NULL; 47     */
48     BuildBTree(root);
49 }
50
51 /*先序方式插入结点*/
52 void BTree::BuildBTree(BTNode **root)
53 {
54     char c;
55    
56     c = getchar();
57     if(c == ‘#’)
58         *root=NULL;
59     else{
60         *root = new BTNode;
61         (*root)->tag = c;
62         BuildBTree(&(*root)->left);
63         BuildBTree(&(*root)->right);
64     }
65 }
66
67 void BTree::PreVisit(BTNode *root)
68 {
69     if(root!=NULL)
70     {
71         printf(“%c “, root->tag );
72         PreVisit(root->left);
73         PreVisit(root->right);
74     }
75 }
76
77 void BTree::InVisit(BTNode *root)
78 {
79     if(root!=NULL)
80     {
81         InVisit(root->left);
82         printf(“%c “, root->tag );
83         InVisit(root->right);
84     }
85 }
86
87 void BTree::PostVisit(BTNode *root)
88 {
89     if(root!=NULL)
90     {
91         PostVisit(root->left);
92         PostVisit(root->right);
93         printf(“%c “, root->tag );
94     }
95 }
96
97 void BTree::NR_PreVisit(BTNode *root)
98 {
99     BTNode *s[MAXN];
100     int top=0;
101
102     while(top!=0 || root!=NULL)
103     {
104         while(root!=NULL)
105         {
106             s[top] = root;
107             printf(“%c “, s[top++]->tag);
108             root = root->left;
109         }
110         if(top>0)
111         {
112             root = s[–top];
113             root = root->right;
114         }
115     }
116 }
117
118 void BTree::NR_InVisit(BTNode *root)
119 {
120     BTNode *s[MAXN];
121     int top=0;
122    
123     while(top!=0 || root!=NULL)
124     {
125         while(root!=NULL)
126         {
127             s[top++]=root;
128             root = root->left;
129         }
130         if(top>0)
131         {
132             root = s[–top];
133             printf(“%c “, root->tag);
134             root = root->right;
135         }
136     }
137 }
138
139 void BTree::NR_PostVisit(BTNode *root)
140 {
141     BTNode *s[MAXN], *tmp=NULL;
142     int top=0;
143
144     while(top!=0 || root!=NULL)
145     {
146         while(root!=NULL)
147         {
148             s[top++]=root;
149             root=root->left;
150         }
151         if(top>0)
152         {
153             root = s[–top];
154
155             /*右孩子不存在或者已经访问过,root出栈并访问*/
156             if( (root->right == NULL) || (root->right == tmp)

157             {
158                 printf(“%c “, root->tag);
159                 tmp = root;        //保存root指针
160                 root=NULL;         //当前指针置空,防止再次入栈
161             }
162
163             /*不出栈,继续访问右孩子*/
164             else
165             {
166                 top++;             //与root=s[–top]保持平衡
167                 root = root->right;
168             }
169         }
170     }
171 }
172
173 int main()
174 {
175     BTNode *root=NULL;
176     BTree bt(&root);  //头指针的地址
177    
178     bt.NR_PreVisit(root);
179     printf(“\n”);
180     bt.NR_InVisit(root);
181     printf(“\n”);
182     bt.NR_PostVisit(root);
183     printf(“\n”);
184     return 0;
185 }

                        //判断是否为闰年
                        function isLeapYear(year){
                        if(year % 4 == 0 && ((year % 100 != 0) || (year
% 400 == 0)))
                        {
                             return true;
                        }
                        return false;
                        }
                        //判断前后两个日期
                        function
validatePeriod(fyear,fmonth,fday,byear,bmonth,bday){
                        if(fyear < byear){
                        return true;
                        }else if(fyear == byear){
                        if(fmonth < bmonth){
                           return true;
                        } else if (fmonth == bmonth){
                           if(fday <= bday){
                            return true;
                           }else {
                            return false;
                           }
                        } else {
                           return false;
                        }
                        }else {
                        return false;
                        }
                        }
                    //计算两个日期的差值
                        function dateDiff(d1,d2){
                            var disNum=compareDate(d1,d2);
                            return disNum;
                        }
                        function compareDate(date1,date2)
                        {
                            var
regexp=/^(\d{1,4})[-|\.]{1}(\d{1,2})[-|\.]{1}(\d{1,2})$/;
                            var monthDays=[0,3,0,1,0,1,0,0,1,0,0,1];
                            regexp.test(date1);
                            var date1Year=RegExp.$1;
                            var date1Month=RegExp.$2;
                            var date1Day=RegExp.$3;

引用类型的值(对象)是引用类型的一个实例。

先上代码,tb带NR(Non-recursive)的表示非递归遍历。

                            regexp.test(date2);
                            var date2Year=RegExp.$1;
                            var date2Month=RegExp.$2;
                            var date2Day=RegExp.$3;

在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。它也通常被称为【类】,但是在js中,类这个称呼并不太妥当。

 

                       
if(validatePeriod(date1Year,date1Month,date1Day,date2Year,date2Month,date2Day)){
                        firstDate=new
Date(date1Year,date1Month,date1Day);
                             secondDate=new
Date(date2Year,date2Month,date2Day);

尽管在技术角度上将,js是一门面向对象的语言,但是严格意义上来讲,js并不具备面向对象语言所支持的类、接口、继承等基本属性。

测试数据:

                            
result=Math.floor((secondDate.getTime()-firstDate.getTime())/(1000*3600*24));
                             for(j=date1Year;j<=date2Year;j++){
                                 if(isLeapYear(j)){
                                     monthDays[1]=2;
                                 }else{
                                     monthDays[1]=3;
                                 }
                                
for(i=date1Month-1;i<date2Month;i++){
                                     result=result-monthDays[i];
                                 }
                             }
                             return result;
                        }else{
                           
alert(‘对不起第一个时间必须小于第二个时间,谢谢!’);
                            exit;
                        }
                        }

引用类型也被称为【对象定义】,因为他们描述的是一类对象所具有的属性和方法。

124#8##5##369###7##

调用该函数传递两个时间值:2012-01-21   2012-12-21
days = dateDiff(d1,d2);

第一节:Object类型

 

作者:wjc19911118

Object
可以说是js中使用最多的一个类型,尽管Object的实例没有多少功能,但是对于程序中存储和传输数据而言,却是非常理想的选择。

表示的二叉树:

function isLeapYear(year){
if(year % 4 == 0 ((year % 100 != 0) || (year % 400 == 0))) { return
true; } return false; } //判断前后两个日期 function v…

创建Object:

 

(1)通过new操作符创建:

用windows自带的画图画的,的确是粗糙了点。。。

1
var Obj=new Object();
2
Obj.a=”a”;
3
Obj.b=function (){
4
    //………
5
}
(2)使用对象字面量创建:这种方式有封装的感觉,而且对于传输大量参数很适用

 

1
var Obj={
2
   a:”a”,
3
   b: function(){
4
      //…………
5
   }
6
}
(3)如果创建时花括号{}留空,则可以定义只包含其默认属性和方法的对象。

测试结果:

1
var Obj = {};
2
Obj.a = “a”;
3
//……
注意:在通过字面量定义对象时,不会调用Object构造函数 (firefox 除外)
访问对象属性的2种方法:

1 2 4 8 5 3 6 9 7
4 8 2 5 1 9 6 3 7
8 4 5 2 9 6 7 3 1

(1)通过 . 操作符进行访问:  Obj.a;
(2)通过 [] 进行访问: Obj[a];

 

 以上两种方式没有任何区别,但是,通过[]访问的优点是可以使用变量,例如:

 

1
var Obj={
2
   a:”a”,
3
   b:”b”,
4
}
5
var c=”a”;
6
alert( Obj[c] ) // a
 

一、关于二叉树的建立

第二节:Array 类型

 

1.用构造函数创建Array对象

  首先要注意二叉树的创建过程,这里用的是先序方式递归插入结点,所以输入数据的时候,必须按照先序方式输入,

(1)使用Array构造函数 : var a=new Array();

左结点或右结点为空的,用#表示。否则,输入不会有响应,因为递归过程还未结束,按CTRL+Z也没用。当然可以用其

(2)如果预先知道数组中的项目的数量,则可以: var a=new Array( 20 );
只不过这20项的值都是Undefined

他方式插入(如中序递归插入,后序递归插入等)。

(3)也可以直接向构造函数传递需要创建的项:var a=new Array( “red”,”blue”
);

 

(4)直接给构造函数传递一个数值,会创建数值数量的空项目:var a=new
Array( 3 )

二、三种非递归遍历的区别

(5)创建数组时也可以省略new操作符:var a= Array( “red”,”blue” );

 

2.用字面量创建Array对象

  前序、中序和后序的递归遍历方式比较简单,这里就不讲了。而非递归的遍历方式,只需要用数组存储结点指针,模拟系统栈的工作机制就可以了。

1
var a=[“red”,”blue”,”black”];// ok
2
var b=[]; //创建了一个空数组
3
var d=[“red”,”blue”,]
//不要这样,不同浏览器解释不通,可能创建了2项或3项
4
var d=[,,,,,] //不要这样,不同浏览器解释不通,可能创建了5项或6项
3.数组的length属性

先说先序非递归遍历,按照根-左-右的方式访问的话,需要将当前结点压栈(同时打印当前结点信息),直到左子树为空(内层while);然后出栈,访问

数组的length属性不是只读的,因此可以通过设置length来从数组的末尾添加或者移除项目:

右结点;后面的操作就跟前面的一样了(外层while)。

01
var a=[“red”,”blue”,”black”];
02
a.length=2; // 删除末尾的项目
03
alert(a[2])// undefined;
04
 
05
var b=[“red”,”blue”,”black”];
06
b.length=4; // 在末尾添加一个新项目,默认值未定义
07
blert(a[4])// undefined;
08
 
09
var c=[“red”,”blue”,”black”];
10
c[c.length]=”orange”; // 在数组末尾直接插入项目,其值为orange
11
c[10]=”white”; //在数组位置10插入项目,其值为 white,
则4-9位置的项目,默认值都为undefined

  对于中序非递归遍历,可以看到代码结构几乎一模一样,只是打印结点信息的位置不同而已。这是因为中序遍历是左-根-右,这样前序和中序非

4.转换方法

递归遍历(根-左和左-根都是压栈动作,且出栈动作的对象都是父节点)是一致的。

所有对象都具有 toString()、toLocaleString()、valueOf() 方法。

 

其中,调用数组的toString() 和 valueOf()
方法返回相同的值,这会在后台调用数组每一项的toString()方法,来拼接其最终的字符串。

  对于后序非递归遍历,因为后序遍历是左-右-根,根的访问是在右孩子之后,而这意味着两种情况:

1
var a=[“red”,”blue”,”black”];
2
alert(a.toString())// 输出:red,blue,black;
3
alert(a.valueOf())// 输出:red,blue,black;
join方法:数组的toString()等方法在输出时,默认用 ,
进行分割,利用join可以指定分割符

  1、右孩子不为空(继续访问右孩子);

1
var a=[“red”,”blue”,”green”];
2
alert(a.join(“/”)); //输出 red/blue/green
5.栈方法和队列方法

  2、右孩子为空,从左孩子返回,则需要访问根结点。

(1)push() 
接收任意数量的参数,把他们添加到数组的末尾,并返回新数组的长度。

  为了区分这两种情况(物理形式上从左孩子返回,还是从右孩子返回来访问根节点),对于右孩子的访问又需要判断根结点的右孩子是否为空或者已

(2)pop() 
从数组的末尾移除项目并返回该项目,与push()一起可以模拟栈操作;

访问过(右子树已遍历过)。除这两种情况外,都不应该访问根节点,而是要继续进入右子树。

(3)shift() 
可以移除数组第一个项目并返回该项目,与push()一起可以模拟队列操作

  

(4)unshift()
接收任意数量参数,在数组前端添加项目,并返回新数组的长度。

三、补充说明

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

标签:
网站地图xml地图