栈C#与JavaScript.docx
- 文档编号:4139012
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:24
- 大小:35.70KB
栈C#与JavaScript.docx
《栈C#与JavaScript.docx》由会员分享,可在线阅读,更多相关《栈C#与JavaScript.docx(24页珍藏版)》请在冰豆网上搜索。
栈C#与JavaScript
西北师范大学地环学院地理信息系
数据结构实验讲义
二栈C#与JavaScript语言实现
张长城
2011-2-8
[C#的栈对象使用、JavaScript顺序表构造栈]
一、
C#的栈对象使用
对C#而言,要使用栈是极其简单的事情,因为C#已经有栈对象,所以根本不需要自用再用顺序表构造栈,只需要你会说明、会应用即可。
在C#中栈对象的类型名称是Stack,这是个泛型的对象,所以,你在使用这个对象的时候,可以不必在意什么类型的数据可以使用。
例1不同对象的的进出栈测试。
打开C#建立一个WINDOWS应用工程,设计如下界面:
图1测试界面设计
这个界面由4个button对象、一个ListBox1对象组成。
其中:
Button1:
圆对象测试;
Button2:
BOX对象测试;
Button3:
字符串进栈测试。
Button4:
结束。
首先看字符串进出栈,C#中说明字符串如下:
stringst1="AAA";
stringst2="BBB";
stringst3="CCC";
stringst4="DDD";
stringst5="EEE";
要使用一个栈来处理字符串,则是:
Stack
注意这个写法:
Stack是栈的类型,<>中是要求保存的数据类型,我们这里是字符串,则其中就是String。
回顾一下我们在链表中的介绍,实际我们也写过这样的链表类:
泛型的链表类。
差别就是在这里,Stack是微软给C#中提供的,实际在VB.NET等语言中都可以引用。
进出栈语句很简单,和我们在C中的没什么差别,就是:
S.Push(st1);
S.Push(st2);
S.Push(st3);
S.Push(st4);
S.Push(st5);
listBox1.Items.Clear();
while(S.Count!
=0)
listBox1.Items.Add(S.Pop());
上述程序见C#下的S0工程。
注意使用习惯上的差异:
在C语言中是按函数的方法引用的,而这里,变量S、这个包含有数据、程序的对象中,直接就有Push()、Pop()方法,实际在使用中不难发现:
C#给S提供了太多的方法和属性。
使用这样的方法,我们大致可以了解Stack类的使用方法,对常见的int、double这样的类型进出栈都是一样的。
以下,我们打开项目->添加类,增加一个Elem.cs的类文件,然后写进以下类程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
classRound
{
publicdoubleR;
publicRound()
{
R=0;
}
publicRound(doubler)
{
R=r;
}
publicdoubleArea()
{
returnMath.PI*R*R;
}
publicdoubleArea(doubler)
{
returnMath.PI*r*r;
}
publicdoubleCircle()
{
return2*Math.PI*R;
}
publicdoubleCircle(doubler)
{
return2*Math.PI*r;
}
}
一个测试类:
圆面积和周长计算,程序见S0工程Elem.cs
注意这个类:
它有两个构造函数Round(),见第4行和第8行,一个没参数、一个有参数,在类中这样名称相同、参数不同的函数、称为重载,这样可以大大方便类的使用。
同样的手段在第12、16行、以及20、24行上再次出现。
继续给这个类下面补充代码,这是一个计算盒子体积的类,也很简单,就是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classBOX
{
publicdoublea,b,c;
publicBOX()
{
a=b=c=0;
}
publicBOX(doubleA,doubleB,doubleC)
{
a=A;b=B;c=C;
}
publicdoubleVolume()
{
returna*b*c;
}
}
一个测试类:
BOX体积计算,程序见S0工程Elem.cs
这里需要说明的是:
Round、BOX这两个类,都不是C#固有的类,而是我们自己编写的类,使用它们构造的对象,都会包含着各自的属性数据、以及其中的程序代码,比如计算面积的函数、计算BOX体积的函数。
回到界面设计,鼠标双点圆对象测试按钮,说明一些圆对象:
1
2
3
4
5
6
7
privatevoidbutton1_Click(objectsender,EventArgse)
{
RoundRA=newRound
(1);
RoundRB=newRound
(2);
RoundRC=newRound(3);
RoundRD=newRound(4);
RoundRE=newRound(5);
}
说明Round类型的对象,程序见S0工程Form1.cs
这5个对象RA、RB、RC、RD、RE分别装有半径1、2、3、4、5的数据,当然,还包含着计算面积周长的数据。
要把这样的对象装进栈里,说明栈对象就是:
Stack
注意和前面的差别,此处是为Round类型的对象申请栈。
补充程序就是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
privatevoidbutton1_Click(objectsender,EventArgse)
{
RoundRA=newRound
(1);
RoundRB=newRound
(2);
RoundRC=newRound(3);
RoundRD=newRound(4);
RoundRE=newRound(5);
Stack
S.Push(RA);
S.Push(RB);
S.Push(RC);
S.Push(RD);
S.Push(RE);
}
为Round类型的对象申请栈对象S并进栈,程序见S0工程Form1.cs
下面我们逐个出栈,出栈就是:
S.Pop()
语句,但我们要知道出栈的数据也是Round类型的,所以其后面肯定有面积方法,所以可以补充语句为:
S.Pop().Area()
当然,这个数据的类型是double类型,要转换成字符串才能给listBox1控件,于是用C#的转换方法:
S.Pop().Area().ToString();
这些语句看起来很长,但只要自己概念清楚、键盘上按”.”键、会自动弹出提示的。
于是整个函数就是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
privatevoidbutton1_Click(objectsender,EventArgse)
{
RoundRA=newRound
(1);
RoundRB=newRound
(2);
RoundRC=newRound(3);
RoundRD=newRound(4);
RoundRE=newRound(5);
Stack
S.Push(RA);
S.Push(RB);
S.Push(RC);
S.Push(RD);
S.Push(RE);
listBox1.Items.Clear();
while(S.Count!
=0)
listBox1.Items.Add(S.Pop().Area().ToString());
}
将5个Round类型的对象进栈并逐个出栈,程序见S0工程Form1.cs
同理,可以将BOX类的对象逐个进栈再逐个出栈,这个程序请自己阅读S0工程的Form1.cs文件。
有了Stack这样的对象,C#下开发程序的效率是非常高的,至今,或许作为操作系统WINDOWS有许多不如人意的地方,但这个系统下强大的开发平台,依然是保障WINDOWS生命力得到不断延续的最坚固基石之一。
至少在今天,许多非常强大的操作系统上还见不到如此优秀的开发平台。
例2四则运算后缀算式的计算。
这个范例在C语言中出现过,C语言下不是图形界面,有个很难看的结果显示,在C#下则要好办的多。
首先在C#下建立一个WINDOWS工程,设计以下界面:
图2后缀表达式计算界面
控件使用了textBox1、button1、button2三个控件,其中在textBox1中输入后缀表达式,按下button1(计算)按钮则显示结果。
鼠标双击Form1,则进入Form1_Load()编程界面,输入:
textBox1.Text="34*5+67*+";
这样的语句说明:
该程序一旦运行则在textBox1控件中显示:
34*5+67*+,我们在这里把这个算式当作默认的算式。
在C#中编程,界面设计完后,最主要的工作就是:
项目->添加类,我们要把那些相同概念的数据、程序全部包含到一个类里、然后按这个类的格式申请内存变量,也就是构造对象。
添加一个名称为:
calculation.cs的类型文件,显示如下:
1
2
3
4
5
6
7
8
9
10
11
12
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Text.RegularExpressions;
namespaceS1
{
classcalculation
{
}
}
说明calculation类,程序见S1工程calculation.cs
(1)字符串中数字字符的判断
注意在上述程序中,一定补充第5行的代码,我们要用这个对象判断一个字符到底是数字、还是运算符。
在C#中,判断一个数字字符的方法来自正则表达式,有关正则表达式的介绍很多,请自己查找相关的资料,我们这里仅仅使用最简单的方法。
首先说明一个正则表达式的对象:
RegexR=newRegex("[0-9]");
R对象将匹配字符0、一直到9,R对象将按这个原则去匹配另外一个对象,如字符串变量ch=”5”,就是说ch中是字符串5,于是下列语句的结果就是真:
R.Match(ch).Success结果为真
如ch=”A”,则语句:
R.Match(ch).Success结果为假
(2)字符串中取得一个字符的方法
另外一个需要注意的是:
C#中取字符串F中第n个字符的方法是:
ch=F.SubString(n,1);
后面的1代表取1个字符。
首先是获得一个后缀表达式,我们这里用构造函数的方法来获得,就是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Text.RegularExpressions;
namespaceS1
{
classcalculation
{
stringF,ch;
intn,num1,num2,num;
publiccalculation()
{
F="";ch="";
}
publiccalculation(stringFormula)
{
F=Formula;
}
}
}
说明calculation类,程序见S1工程calculation.cs
类中的变量名称我们依然使用S2.C中的习惯,Formula将是后缀表达式的字符串。
回顾我们在S2.C中编写的程序,其中有个函数Comput(inaa,intb,charo),
这个函数是根据字符o中的运算符来计算a,b,我们需要补充到这个类里,值得注意的是:
这个函数我们仅仅需要在内部计算即可,而不能让对象中直接调用,这种情况下这个函数的前面就应该加上private的修饰。
于是再次补充这个类就是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Text.RegularExpressions;
namespaceS1
{
classcalculation
{
stringF,ch;
intn,num1,num2,num;
publiccalculation()
{
F="";ch="";
}
publiccalculation(stringFormula)
{
F=Formula;
}
privateintComput(inta,intb,stringo)
{
intc=0;
switch(o)
{
case"+":
c=a+b;break;
case"-":
c=a-b;break;
case"*":
c=a*b;break;
case"/":
c=a/b;break;
default:
c=0;break;
}
returnc;
}
}
补充calculation类之一:
加入一个私有的方法,程序见S1工程calculation.cs
注意这个函数中的语句,和C语言基本一致,但更加严格,比如c一开始就必须是给出0这样确定的值,default语句后也必须有break,相应的在case后的常数部分,C语言的case‘+’,由于此时o是字符串,则在这里必须写成case“+”
这些都是语言的细节所决定的,实际编程思路没有任何差异。
这个方法从第21行开始。
最后,就是补充根据后缀表达式计算的过程,这个过程就是说遇到数字先进栈、遇到运算符则数字出栈计算、计算结果再进栈,于是补充这个方法就是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Text.RegularExpressions;
namespaceS1
{
classcalculation
{
stringF,ch;
intn,num1,num2,num;
publiccalculation()
{
F="";ch="";
}
publiccalculation(stringFormula)
{
F=Formula;
}
privateintComput(inta,intb,stringo)
{
intc=0;
switch(o)
{
case"+":
c=a+b;break;
case"-":
c=a-b;break;
case"*":
c=a*b;break;
case"/":
c=a/b;break;
default:
c=0;break;
}
returnc;
}
publicintResult()
{
RegexR=newRegex("[0-9]");
Stack
n=0;
while(n { ch=F.Substring(n,1); if(R.Match(ch).Success) { s.Push(int.Parse(ch)); } else { num1=s.Pop(); num2=s.Pop(); num=Comput(num1,num2,ch); s.Push(num); } n++; } returns.Pop(); } } 补充calculation类之二: 加入一个计算方法,程序见S1工程calculation.cs 注意这个方法中第35行,在这个问题中,遇到数字要进栈,所以我们为一个整数构造了栈对象s,所以说明方法是: Stack 这样栈可以把遇到的整数保存在栈里。 而把字符转换成整数,一般用: Int.Parse(ch); 这样的语句即可。 (4)界面类测试程序设计 到界面设计,鼠标双击计算按钮,进入编程界面,写入: 1 2 3 4 5 6 privatevoidbutton1_Click(objectsender,EventArgse) { calculationC=newcalculation(textBox1.Text); MessageBox.Show("该算式计算结果是"+C.Result().ToString(),"计算结果",MessageBoxButtons.OK); } 测试后缀表达式计算的类,程序见S1工程Form1.cs 这个程序里,语句: calculationC=newcalculation(textBox1.Text); 说明创建一个对象C、其中包含类calculation中全部数据和函数,它运算所需要的后缀表达式来自textBox1.Text,也就是文本框中输入的字符。 语句: MessageBox.Show("该算式计算结果是"+C.Result().ToString(),"计算结果",MessageBoxButtons.OK); 是用消息框的形式、把计算结果报告出来,注意我们的计算结果是整数,要转换成字符串才可以,也就是: "该算式计算结果是"+C.Result().ToString() 在这个方法的第2项: "计算结果"则把这个串显示在这个消息框的标题中; MessageBoxButtons.OK则是说这个消息框有一个OK的按钮,如下图。 图3运行结果消息框 这些都是C#语言的定义,实际对一个熟悉C、正在学习VB6的人而言,C#的学习难度不是很大。 通过上述介绍不难发现: 使用C#完成栈的应用非常简单,而且有图形界面,运行结果可以很好地显示出来,这个是C语言不容易完成的事情,所以仅就WINDOWS开发而言,显然C#有这个极其强大的功能。 作业 1C#完成将中缀表达式转换成后缀表达式的程序; 2C#中完成将中缀表达式直接计算出结果的程序。 3尝试编程能计算浮点数的四则运算。 二、JavaScript的栈以及应用 JavaScript的栈是数组对象中自动提供的,这点如同C#,实际也不需要自己编写什么栈的程序,如果你用: vars=newArray(); 定义一个s的数组,则这个s上将有以下的方法可供使用: 其中: FF: Firefox,IE: InternetExplorer 方法 描述 FF IE concat() 连接两个或更多的数组,并返回结果。 1 4 join() 把数组的所有元素放入一个字符串。 元素通过指定的分隔符进行分隔。 1 4 pop() 删除并返回数组的最后一个元素 1 5.5 push() 向数组的末尾添加一个或更多元素,并返回新的长度。 1 5.5 reverse() 颠倒数组中元素的顺序。 1 4 shift() 删除并返回数组的第一个元素 1 5.5 slice() 从某个已有的数组返回选定的元素 1 4 sort() 对数组的元素进行排序 1 4 splice() 删除元素,并向数组添加新元素。 1 5.5 toSource() 返回该对象的源代码。 1 - toString() 把数组转换为字符串,并返回结果。 1 4 toLocaleString() 把数组转换为本地数组,并返回结果。 1 4 unshift() 向数组的开头添加一个或更多元素,并返回新的长度。 1 6 valueOf() 返回数组对象的原始值 1 4 而这个对象提供的属性,则如下表: FF: Firefox,IE: InternetExplorer 属性 描述 FF IE constructor 返回对创建此对象的数组函数的引用。 1 4 index 1 4 input 1 4 length 设置或返回数组中元素的数目。 1 4 prototype 使您有能力向对象添加属性和方法。 1 4 由于JavaScript本身并没有什么具体类型,s将能保存任何对象,所以说JavaScript也是一个功能非常强大的语言。 所以使用现有的栈是非常好的习惯,在这里先将几个字符串做进出栈的测试,就是: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# JavaScript