栈C#与JavaScript.docx

上传人:b****6 文档编号:4139012 上传时间:2022-11-28 格式:DOCX 页数:24 大小:35.70KB
下载 相关 举报
栈C#与JavaScript.docx_第1页
第1页 / 共24页
栈C#与JavaScript.docx_第2页
第2页 / 共24页
栈C#与JavaScript.docx_第3页
第3页 / 共24页
栈C#与JavaScript.docx_第4页
第4页 / 共24页
栈C#与JavaScript.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

栈C#与JavaScript.docx

《栈C#与JavaScript.docx》由会员分享,可在线阅读,更多相关《栈C#与JavaScript.docx(24页珍藏版)》请在冰豆网上搜索。

栈C#与JavaScript.docx

栈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";

要使用一个栈来处理字符串,则是:

StackS=newStack();

注意这个写法:

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的数据,当然,还包含着计算面积周长的数据。

要把这样的对象装进栈里,说明栈对象就是:

StackS=newStack();

注意和前面的差别,此处是为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);

StackS=newStack();

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);

StackS=newStack();

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]");

Stacks=newStack();

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,所以说明方法是:

Stacks=newStack();

这样栈可以把遇到的整数保存在栈里。

而把字符转换成整数,一般用:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1