当前位置:文档之家› 数据结构--算术表达式求值

数据结构--算术表达式求值

数据结构--算术表达式求值
数据结构--算术表达式求值

课程设计说明书

课程名称:数据结构和算法

设计题目:算术表达式求值

院系:计算机科学与信息工程学院

学生姓名:蒋卓航

学号:201203030093

专业班级:软件工程12-2班

指导教师:宋强

2014年06月16日

课程设计任务书

算术表达式求值

摘要:

表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

关键词:

括号匹配运算符

优先级数据类型转换

表达式求值

目录

1. 设计背景 (4)

1.1问题描述 (4)

1.2 问题分析 (4)

2.设计方案 (4)

2.1数据结构设计 (4)

2.2 算法设计 (4)

2.3 ADT描述 (5)

2.4 功能模块分析 (6)

3. 方案实施 (7)

3.1数据存储结构设计 (7)

3.2主要算法流程图 (7)

4. 结果与结论 (11)

4.1正确结果 (11)

4.2错误信息 (11)

5. 收获与致谢 (12)

6. 参考文献 (12)

7. 附件 (13)

1. 设计背景

1.1问题描述

表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

1.2 问题分析

在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。

算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为浮点型,操作符为+、-*、/,用#表示结束。

算法输出:表达式运算结果。

算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。

2.设计方案

2.1数据结构设计

任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。

2.2 算法设计

为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR,用以寄存运算符,

另一个称做OPND,用以寄存操作数或运算结果。

1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;

2.依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为”#”)。

2.3 ADT描述

ADT Stack{

数据对象:D={ |∈ElemSet,i=1,2,…,n, n≧0}

数据对象:R1={<>|,,i=2,…,n}

约定端为栈顶,端为栈底。

基本操作:

InitStack(&S)

操作结果:构造一个空栈S。

GetTop(S)

初始条件:栈S已存在。

操作结果:用P返回S的栈顶元素。

Push(&S,ch)

初始条件:栈S已存在。

操作结果:插入元素ch为新的栈顶元素。

Pop(&S)

初始条件:栈S已存在。

操作结果:删除S的栈顶元素。

In(ch)

操作结果:判断字符是否是运算符,运算符即返回1。

Precede(c1, c2)

初始条件:c1,c2为运算符。

操作结果:判断运算符优先权,返回优先权高的。

Operate(a,op,b)

初始条件:a,b为整数,op为运算符。

操作结果:a与b进行运算,op为运算符,返回其值。

num(n)

操作结果:返回操作数的长度。

EvalExpr()

初始条件:输入表达式合法。

操作结果:返回表达式的最终结果。

}ADT Stack

2.4 功能模块分析

1.栈的基本功能。

InitStack(Stack *s) 和InitStack2(Stack2 *s)分别构造运算符栈与构造操作数栈,Push(Stack *s,char ch) 运算符栈插入ch为新的栈顶元素,Push2(Stack2 *s,int ch) 操作数栈插入ch为新的栈顶元素,Pop(Stack *s) 删除运算符栈s的栈顶元素,用p返回其值,Pop2(Stack2 *s)删除操作数栈s的栈顶元素,用p返回其值,GetTop(Stack s)用p返回运算符栈s的栈顶元素,GetTop2(Stack2 s) 用p返回操作数栈s的栈顶元素。

2.其它功能分析。

(1)In(char ch) 判断字符是否是运算符功能,运算符即返回1,该功能只需简单的一条语句即可实现,

return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#')。

(2) Precede(char c1,char c2) 判断运算符优先权功能,该函数判断运算符c1,c2的优先权,具体优先关系参照表1。

(3) Operate(int a,char op,int b)操作数用对应的运算符进行运算功能。运算结果直接返回。

(4) num(int n) 求操作数的长度功能,需要用itoa函数把int型转换成字符串型,strlen函数可求字符长度。

(5) EvalExpr()主要操作函数运算功能。分析详细见“3.详细设计…3.2”。

3. 方案实施

3.1数据存储结构设计

因为表达式是由操作符,运算符和界限符组成的。如果只用一个char类型栈,不能满足2位以上的整数,所以还需要定义一个int类型的栈用来寄存操作数。

/* 定义字符类型栈 */

typedef struct{

int stacksize;

char *base;

char *top;

} Stack;

/* 定义浮点型栈 */

typedef struct{

int stacksize;

int *base;

int *top;

} Stack2;

3.2主要算法流程图

1. Precede(char c1,char c2) 判断运算符优先权,返回优先权高的。

算符间的优先关系如下:

算法伪代码如下:

char Precede(char c1,char c2)

{

static char array[49]={

'>', '>', '<', '<', '<', '>', '>',

'>', '>', '<', '<', '<', '>', '>',

'>', '>', '>', '>', '<', '>', '>',

'>', '>', '>', '>', '<', '>', '>',

'<', '<', '<', '<', '<', '=', '!',

'>', '>', '>', '>', '!', '>', '>',

'<', '<', '<', '<', '<', '!', '='}; //用一维数组存储49种情况switch(c1)

{

/* i为下面array的横标 */

case '+' : i=0;break;

case '-' : i=1;break;

case '*' : i=2;break;

case '/' : i=3;break;

case '(' : i=4;break;

case ')' : i=5;break;

case '#' : i=6;break;

}

switch(c2)

{

/* j为下面array的纵标 */

case '+' : j=0;break;

case '-' : j=1;break;

case '*' : j=2;break;

case '/' : j=3;break;

case '(' : j=4;break;

case ')' : j=5;break;

case '#' : j=6;break;

}

return (array[7*i+j]); /* 返回运算符array[7*i+j]为对应的c1,c2优先关系*/ }

2. int EvalExpr()主要操作函数。算法概要流程图:

利用该算法对算术表达式3*(7-2)求值操作过程如下:

算法伪代码如下:

int EvalExpr()//主要操作函数

{ c = *ptr++;

while(c!='#'||GetTop(OPTR)!='#') {

if(!In(c)) //不是运算符即进栈

{ if(!In(*(ptr-1))) ptr=ptr-1;

m=atoi(ptr);//取字符串前面的数字段n=num(m);

Push2(&OPND,m);

ptr=ptr+n;

c=*ptr++;

}

else

switch(Precede(GetTop(OPTR),c)) {

case '<': //栈顶元素优先权底

Push(&OPTR,c);

c = *ptr++;

break;

case '=': //脱括号并接收下一字符

x=Pop(&OPTR);

c = *ptr++;

break;

case '>'://退栈并将运算结果入栈theta=Pop(&OPTR);

b=Pop2(&OPND); a=Pop2(&OPND); Push2(&OPND,Operate(a,theta,b)); break;

}

}

4. 结果与结论4.1正确结果

图4.1 正确结果

4.2错误信息

图4.2 括号匹配错误

图4.3 零除错误

5. 收获与致谢

这次课程设计让我更加了解大一学到的C和这个学期学到的数据结构。课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。

这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。就像我在写EvalExpr()函数时,忘了指针的地址符值不用加*号,这一点小小的错误也耽误了我几十分钟,所以说细节很重要。

程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机的重要作用,特别算术表达式有了深刻的理解。

这个程序是我们5个人完成的,同时我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。某个人的离群都可能导致导致整项工作的失败。实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。团结协作是我们成功的一项非常重要的保证。而这次课程设计也正好锻炼我们这一点,这也是非常宝贵的

最后,感谢老师在这次课程设计的悉心指导,祝老师身体健康,工作顺利。

6. 参考文献

1.《数据结构(C语言版)》严蔚敏清华大学出版社

2.《C语言程序设计》丁峻岭中国铁道出版社

3.《C程序设计》谭浩强清华大学出版社

7. 附件

程序源代码:

#include

#include

#include

#define OK 1

#define ERROR -1

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 20

int error=0;

/* 定义字符类型栈 */

typedef struct

{

int stacksize;

char *base;

char *top;

}Stack;

/* 定义double型栈 */

typedef struct

{

double stacksize;

double *base;

double *top;

}Stack2;

/* ----------------- 全局变量--------------- */ Stack OPTR;/* 定义运算符栈*/

Stack2 OPND; /* 定义操作数栈 */

char expr[255] = ""; /* 存放表达式串 */

char *ptr = expr;

int InitStack(Stack *s) //构造运算符栈

{

s->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));

if(!s->base) return ERROR;

s->top=s->base;

s->stacksize=STACK_INIT_SIZE;

return OK;

}

int InitStack2(Stack2 *s) //构造操作数栈

{

s->base=(double *)malloc(STACK_INIT_SIZE*sizeof(double));

if(!s->base) return ERROR;

s->stacksize=STACK_INIT_SIZE;

s->top=s->base;

return OK;

}

int In(char ch) //判断字符是否是运算符,运算符即返回1

{

return(ch!='0'&&ch!='1'&&ch!='2'&&ch!='3'&&ch!='4'&&ch!='5'&&ch!='6'&&ch!=' 7'&&ch!='8'&&ch!='9'&&ch!='.');

}

int Push(Stack *s,char ch) //运算符栈插入ch为新的栈顶元素

{

*s->top=ch;

s->top++;

return 0;

}

int Push2(Stack2 *s,double ch)//操作数栈插入ch为新的栈顶元素{

*s->top=ch;

s->top++;

return 0;

}

char Pop(Stack *s) //删除运算符栈s的栈顶元素,用p返回其值{

char p;

s->top--;

p=*s->top;

return p;

}

double Pop2(Stack2 *s)//删除操作数栈s的栈顶元素,用p返回其值{

double p;

s->top--;

p=*s->top;

return p;

}

char GetTop(Stack s)//用p返回运算符栈s的栈顶元素

{

char p=*(s.top-1);

return p;

}

double GetTop2(Stack2 s) //用p返回操作数栈s的栈顶元素

{

double p=*(s.top-1);

return p;

}

/* 判断运算符优先权,返回优先权高的 */

//运算符优先级表的初始化

char Precede(char c1,char c2)

{

int i=0,j=0;

static char array[49]={

'>', '>', '<', '<', '<', '>', '>',

'>', '>', '<', '<', '<', '>', '>',

'>', '>', '>', '>', '<', '>', '>',

'>', '>', '>', '>', '<', '>', '>',

'<', '<', '<', '<', '<', '=', '1',

'>', '>', '>', '>', '2', '>', '>',

'<', '<', '<', '<', '<', '3', '='};

switch(c1)

{

/* i为下面array的横标 */

case '+' : i=0;break;

case '-' : i=1;break;

case '*' : i=2;break;

case '/' : i=3;break;

case '(' : i=4;break;

case ')' : i=5;break;

case '#' : i=6;break;

default:printf("表达式含有非法运算符!!!\n");error++;break; }

switch(c2)

{

/* j为下面array的纵标 */

case '+' : j=0;break;

case '-' : j=1;break;

case '*' : j=2;break;

case '/' : j=3;break;

case '(' : j=4;break;

case ')' : j=5;break;

case '#' : j=6;break;

default:printf("表达式含有非法运算符!!!\n");error++;break; }

return (array[7*i+j]); /* 返回运算符 */

}

/*操作函数 */

double Operate(double a,char op,double b)

{

switch(op)

{

case '+' : return (a+b);

case '-' : return (a-b);

case '*' : return (a*b);

case '/' :

{

if(b==0)

{

printf("表达式零做除数!!!\n");

error++;

return 0;

}

else return (a/b);

}

}

return 0;

}

double EvalExpr()//主要操作函数

{

char c,theta,x;

int n;

double m;

double a,b;

c = *ptr++;

while(c!='#'||GetTop(OPTR)!='#')

{

if(!In(c))

{

if(!In(*(ptr-1))) ptr=ptr-1;//校验数字

m=strtod(ptr,NULL);//取字符串前面的数字段转化为浮点型 Push2(&OPND,m);

while(!In(*(ptr))) ptr++;

c=*ptr;

}

else{

switch(Precede(GetTop(OPTR),c))

{

case '<':

Push(&OPTR,c);

ptr++;

c=*ptr;

break;

case '=':

x=Pop(&OPTR);

ptr++;

c=*ptr;

break;

case '>':

theta=Pop(&OPTR);

b=Pop2(&OPND);

a=Pop2(&OPND);

Push2(&OPND,Operate(a,theta,b));

break;

case '1':

printf("表达式多出一个左括号!!!\n");error++;

break;

case '2':

printf("表达式出现非法括号!!!\n");error++;

break;

case '3':

printf("表达式多出一个右括号!!!\n");error++;

break;

default:printf("表达式出现未知错误!!!\n");error++;break; }

if(error!=0) break;

}

}

return GetTop2(OPND);

}

int main( )

{

double z;

printf("请输入正确的表达式以'#'结尾:\n");

do

{

gets(expr);

数据结构表达式求值实验报告

竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告 篇一:数据结构实验二——算术表达式求值实验报告 《数据结构与数据库》 实验报告 实验题目算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系pb0920603 姓学 邮名:李维谷号:pb09206285箱: liwg@https://www.doczj.com/doc/061133434.html,指导教师:贾伯琪 实验时间:20XX年10月10日 一、需要分析 问题描述: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。

问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)#

数据结构实验二——算术表达式求值实验报告

《数据结构与数据库》 实验报告 实验题目 算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系PB0920603 姓名:李维谷 学号:PB09206285 邮箱:liwg@https://www.doczj.com/doc/061133434.html, 指导教师:贾伯琪 实验时间:2010年10月10日 一、需要分析 问题描述:

表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。 问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)# 输出结果:194.4

算术表达式求值演示程序

数理学院 课程设计报告书 课程名称数据结构课程设计 设计题目算术表达式求值演示 专业班级 学号 姓名 指导教师

2014 年12 月

4.2.2 基本操作: InitStack(&S) 操作结果:构造一个空栈S。 GetTop(S) 初始条件:栈S 已存在。 操作结 果: 用P 返回S的栈顶元素。Push(&S 初始条 件:,ch) 栈S 已存在。 操作结 果:插入元素ch 为新的栈顶元素。 Pop(&S) 初始条件:栈S 已存在。 操作结 果:删除S 的栈顶元素。 In(ch) 操作结果:判断字符是否是运算符,运算符即返回1 Precede(c1, c2) 初始条件:c1,c2 为运算符。操作结果:判断运算符优先权,返回优先权高的。Operate(a,op,b) 初始条件:a,b 为整数,op为运算符。操作结果: a 与 b 进行运算,op 为运算符,返回其值。num(n) 操作结果:返回操作数的长度。EvalExpr() 初始条件:输入表达式合法。操作结果:返回表达式的最终结果。}ADT Stack 主程序的流程:

EvaluateExpression() 函数实现了对表达式求值的功能,main() 函数直接调用EvaluateExpression() 对输入的表达式求值输出。 4.2.3 函数的调用关系图

4.3 详细设计 4.3.1 ① . Precede(char c1,char c2)判断运算符优先权,返回优先权高的 算符间的优先关系 如下: 算法伪代码如下: char Precede(char c1,char c2) { static char array[49]={ >', '>', '<', '<', '<', '>', '>', >', '>', '<', '<', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', <', '<', '<', '<', '<', '=', '!', >', '>', '>', '>', '!', '>', '>', <', '<', '<', '<', '<', '!', '='}; // 用一维数组存储 49 种情况 switch(c1) { /* i 为下面 array 的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break;

中缀表达式求值

江西理工大学软件学院计算机类课程实验报告 课程名称:数据结构 班级:11软件会计4班 姓名:黄健 学号:11222122 江西理工大学软件学院

一、目录(中缀表达式求值) 1、目录--------------------------------------------------------------2 2、实验目的--------------------------------------------------------3 3、实验要求--------------------------------------------------------3 4、实验仪器设备与材料-----------------------------------------3 5、实验原理--------------------------------------------------------4 6、实验步骤--------------------------------------------------------5 7、实验原始记录--------------------------------------------------6 8、实验数据分析计算结果--------------------------------------10 9、实验心得体会--------------------------------------------------11 10、思考题----------------------------------------------------------12

数据结构算术表达式求值实验报告

软件技术基础实验报告 实验名称:表达式计算器 系别:通信工程 年级: 班级: 学生学号: 学生姓名: 《数据结构》课程设计报告 题目简易计算表达式的演示 【题目要求】 要求:实现基本表达式计算的功能 输入:数学表达式,表达式由整数和“+”、“-”、“×”、“/”、“(”、“)”组成输出:表达式的值 基本操作:键入表达式,开始计算,计算过程和结果记录在文档中 难点:括号的处理、乘除的优先级高于加减

1.前言 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 算法输入:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为简化,规定操作数只能为正整数,操作符为+、-*、/、=,用#表示结束。 算法输出:表达式运算结果。 算法要点:设置运算符栈和运算数栈辅助分析算符优先关系。在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。 2.概要设计 2.1 数据结构设计 任何一个表达式都是由操作符,运算符和界限符组成的。我们分别用顺序栈来寄存表达式的操作数和运算符。栈是限定于紧仅在表尾进行插入或删除操作的线性表。顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top 指示栈顶元素在顺序栈中的位置,base 为栈底指针,在顺序栈中,它始终指向栈底,即top=base 可作为栈空的标记,每当插入新的栈顶元素时,指针top 增1,删除栈顶元素时,指针top 减1。 2.2 算法设计 为了实现算符优先算法。可以使用两个工作栈。一个称为OPTR ,用以寄存运算符,另一个称做OPND ,用以寄存操作数或运算结果。 1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素; 2.依次读入表达式,若是操作符即进OPND 栈,若是运算符则和OPTR 栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR 栈的栈顶元素和当前读入的字符均为”#”)。 2.3 ADT 描述 ADT Stack{ 数据对象:D={ i a |i a ∈ElemSet,i=1,2,…,n, n ≧0} 数据对象:R1={< 1 ,-i i a a >| 1-i a ,D a i ∈,i=2,…,n}

表达式求值课程设计报告

表达式求值课程设计报告 表达式求值 《数据结构》 课程设计报告 题目: 栈的应用:表达式求值 (系): 信息科学与工程学院院 专业班级: 软件工程1102班学生姓名: 学号: 指导教师: 20 13 年 6 月 8 日至20 13 年 6 月 21 日 表达式求值 目录 目录 (2) 1 概述 (1) 1.1 课程设计目的 (1) 1.2 课程设计内容 (1) 2 系统需求分析 ...................................................... 1 2.1 系统目标 (1) 2.2 主体功能 (1) 2.3 开发环境 (1) 3 系统概要设计 .................................................... 2 3.1 系统的功能模块划分 (2)

3.2 系统流程图 (2) 4系统详细设计 ..................................................... 3 5 测试 ............................................................ 6 5.1 测试方案 (6) 5.2 测试结果 (6) 6 小结 ............................................................ 8 参考文献 .......................................................... 9 附录1 源程序清单 (10) 2 数据结构课程设计报告(2012) 表达式求值 1 概述 1.1 课程设计目的 1(要求学生达到熟练掌握C语言的基本知识和技能。 2(了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力。 3(提高程序设计和调试能力。学生通过上机实习,验证自己设计的算法的正确性。学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。 4(培养算法分析能力。分析所设计算法的时间复杂度和空间复杂度,进一步提 高程序设计水平。

算术表达式求值课程设计报告

课程设计 教学院 课程名称 题目 专业 班级 姓名 同组人员 指导教师 2013 年 6 月22 日 (完成时间)

目录 一.概述 (2) 二.总体方案设计 (4) 三.详细设计 (6) 四.程序的调试与运行结果说明 (14) 五.课程设计总结 (14) 六.附录 (16) 参考文献 (3233) (“目录”要求必须自动生成)

一概述(宋体,三号,加粗,居中) 1.课程设计的目的(小标题,宋体,四号,加粗,左对齐顶格) (1).理解和掌握该课程中的有关基本概念,程序设计思想和方法。 (2).培养综合运用所学知识独立完成课题的能力。 (3).培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 (4).掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 2.课程设计的要求 算术表达式求值程序实现以下功能: (1)构造一个空栈S,初始条件:栈S已存在 (2)用P返回S的栈顶元素 (3)插入元素ch为新的栈顶元素 (4)删除S的栈顶元素 (5)判断字符是否是运算符,运算符即返回1 (6)判断运算符优先权,返回优先权高的 (7)输入表达式 (8)返回表达式的最终结果。

二总体方案设计 a)需求分析 该程序能实现算术四则运算表达式的求值,显示运算过程。 输入的形式:表达式,例如5*(3+7)#。 包含的运算符只能有'+'、 '-'、'*'、 '/'、 ' (' ') '; 程序所能达到的功能:对表达式求值并输出。 b)总体设计 本程序使用的是编程工具是Visual c++ 6.0,实现了运算器的功能和仿真界面(大体界面如下图所示)。在基本要求的基础上,运算数可以是实数类型,同时增加了乘方运算的功能;可以实现对负数的运算,例如用户输入表达式6* (-0.25),则程序会在负号的前面自动加上一个0。 1)算符包括加(+)、减(-)、乘(*)、除(/)、乘方(^);另一个称作 OPND,用以寄存操作数和运算结果,操作数可以是float型的浮点数。 算法的基本思想是: 2)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素; 依次读入表达式中的每个字符,若是操作数(浮点数)则进OPND栈, 若是运算符(+、—、*、/、^)则和OPTR栈的栈顶运算符比较优先权 后作相应操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当 前读入的字符均为“#”)。 3)编写一个原型为void strtofloat(char str[ ],int n,int i),把一 个数字串转换为一个实型数,并压入运算数栈中。(整个程序的源代码 见附录,并有具体解释)

数据结构课程设计_表达式求值问题

实验表达式求值问题 1.问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3.中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀表达式(如:11 22 7 4 - * 3 / +)和前缀表达式(+ 11 / * 22 - 7 4 3)。后缀表达式 和前缀表达式中没有括号,给计算带来方便。如后缀表达式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。 2.数据结构设计 (1)顺序栈类定义:首先应在类中定义成员函数,以此来完成顺序栈的相关操作,如下: class SqStack { private: T *base; //栈底指针 int top; //栈顶 int stacksize; //栈容量public: SqStack(int m); //构建函数 ~SqStack(){delete [] base;top=0;stacksize=0;} //析构函数 void Push(T x); //入栈 T Pop(); //出栈 T GetTop(); //获取栈顶元素

int StackEmpty(); //测栈空 void ClearStack(); //清空栈 void StackTop(); //返回栈顶指针 void StackTranverse(); //显示栈中元素 }; (2)顺序栈类实现:对顺序栈进行初始化,初始化的首要操作就是创建一个空顺序栈。 Step1:申请一组连续的存空间为顺序栈使用: base=new T[m]; i f(base==NULL) { cout<<"栈创建失败,退出!"<

数据结构课程设计报告-中缀算术表达式求值

课程设计报告 课程名称数据结构 课题名称中缀算术表达式求值 专业通信工程 班级通信0902 学号 姓名 指导教师 2011 年07 月01 日

湖南工程学院 课程设计任务书 课程名称数据结构 课题中缀算术表达式求值 专业班级通信工程0902 学生姓名 学号 指导老师 审批 任务书下达日期2011 年06 月27日 任务完成日期2011 年07 月01日

设计要求: 1. 课程设计报告规范 (1)需求分析 a.程序的功能。 b.输入输出的要求。 (2)概要设计 a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系; 每个模块的功能。 b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是 什么样的结构,它们之间有什么关系等。 (3)详细设计 a.采用C语言定义相关的数据类型。 b.写出各模块的类C码算法。 c.画出各函数的调用关系图、主要函数的流程图。 (4)调试分析以及设计体会 a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输 出结果和含有错误的输入及输出结果。 b.程序调试中遇到的问题以及解决问题的方法。 c.课程设计过程经验教训、心得体会。 (5)使用说明 用户使用手册:说明如何使用你编写的程序,详细列出每一步的操作步 骤。 (6)书写格式 a.设计报告要求用A4纸打印成册: b.一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行 距为22。 (7)附录 源程序清单(带注释)

2. 考核方式 指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分:(1)平时出勤(占10%) (2)系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%) (3)程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)(4)设计报告(占30%) 注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。 (5)独立完成情况(占10%)。 3 . 课程验收 (1)运行所设计的系统。 (2)回答有关问题。 (3)提交课程设计报告。 (4)提交软盘(源程序、设计报告文档)。 (5)依内容的创新程度,完善程序情况及对程序讲解情况打分。 2 进度安排 第19 周:星期一8:00——12:00 上课 星期一14:30——18:30 上机 星期二14:30——18:30 上机 星期四8:00——12:00 上机 附: 课程设计报告装订顺序:封面、任务书、目录、正文、评分表、附件(A4大小的图纸及程序清单)。 正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。 正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现

C语言_算术表达式求值_代码

源代码: //用来存储字符的结点类型 typedef struct CharNode { char c; struct CharNode *next; }CharNode; //用来存储数的结点类型 typedef struct IntNode { long double i; struct IntNode *next; }IntNode; //用来存储数的结点类型 typedef struct Node { long double n; struct Node_ys_char *next; }Node; //用来存储运算符的结点类型 typedef struct Node_ys_char { char c; struct Node_ys_char *next_c; struct Node *next; }Node_ys_char; char Precede(char x,char y)//运算符优先级判断{ int i,j; int from[5][5] ={ {0,0,-1,-1,0}, {0,0,-1,-1,0}, {1,1,0,0,1},

{1,1,0,0,1}, {0,0,-1,-1,0} };//定义一个二维数组存放算术符号的优先级 switch(x) { case '+':i=0;break; case '-':i=1;break; case '*':i=2;break; case '/':i=3;break; case '#':i=4;break; } switch(y) { case '+':j=0;break; case '-':j=1;break; case '*':j=2;break; case '/':j=3;break; case '#':j=4;break; } if(from[i][j]==1)//说明运算符i的优先级比j的优先级高return '>'; if(from[i][j]==-1) return '<'; else return '='; } //输入表达式,并对特殊情况做处理 CharNode *CreatRegister() { CharNode *top,*p,*q,*e; top=(CharNode *)malloc(sizeof(CharNode)); p=q=top; scanf("%c",&p->c); scanf("%c",&p->c);

c语言中缀后缀算术表达式求值用栈实现

c语言中缀、后缀算术表达式求值用栈实现 #include<stdio.h> #include<string.h> #include<malloc.h> #include<stdlib.h> #define MaxSize 50 typedef struct { float data[MaxSize]; int top; }OpStack; typedef struct { char data[MaxSize]; int top; }SeqStack; void InitStack(SeqStack *S);//初始化栈 int StackEmpty(SeqStack S);//判断栈是否为空 int PushStack(SeqStack *S,char e);//进栈 int PopStack(SeqStack *S,char *e);//删除栈顶元素 int GetTop(SeqStack S,char *e);//取栈顶元素 void TranslateExpress(char s1[],char s2[]);//将中缀表达式转化为后缀表达式float ComputeExpress(char s[]);//计算后缀表达式的值 void main() { char a[MaxSize],b[MaxSize]; float f; printf("请输入一个算术表达式:\n"); gets(a); printf("中缀表达式为:%s\n",a); TranslateExpress(a,b); printf("后缀表达式为:%s\n",b); f=ComputeExpress(b); printf("计算结果:%f\n",f); } void InitStack(SeqStack *S)//初始化栈

数据结构表达式求值代码

//代码部分: #include using namespace std; #define MAXSIZE 100 typedef char ElemType;//定义栈 typedef struct{ char a[MAXSIZE]; int top;//栈顶指针 }SqStack; char op[8]={'+','-','*','/','(',')','#'};//运算符集 char ch[7][7]={ //运算符优先关系集{'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=',' '}, {'>','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='} }; void InitStack(SqStack &s) { for(int i=0;i

ElemType Pop(SqStack &s,ElemType &e) { if (s.top==0) { cout<<"Stack is empty!"<

算术表达式求值课设报告

数据结构课程设计 设计说明书表达式求值算法的实现((()()(( 学生姓名 学号 班级 成绩 指导教师 数学与计算机科学学院 2012年 9月 7日

数据结构课程设计评阅书

课程设计任务书 2011—2012学年第2学期 专业学号:姓名: 课程设计名称:数据结构课程设计 设计题目:表达式求值算法的实现 完成期限:自 2012 年 8 月 28 日至 2012 年 9 月 7 日共 2 周 栈的存储和相关运算是数据结构中数组部分的重点知识和技能。表达式求值算法可借助栈来完成,它的存储可以使用顺序结构也可以使用链式结构,这要根据具体的应用来决定。本课程设计按以下的要求运用C/ C++结构体、指针、数据结构等基知识编程实现。 任务要求:1)阐述设计思想,画出流程图;2)任意输入一个表达式(算术、逻辑、关系表达式);3)建立栈;4)借助栈的相关运算完成表达式求值过程;5)将表达式及其运算结果按照其数学形式打印输出; 6)说明测试方法,写出完整的运行结果,较好的界面设计;7)按照格式要求完成课程设计说明书。设计要求: 1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么?确定问题的输入数据集合。 2)逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型。逻辑设计的结果应写出每个抽象数据类型的定义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调用关系图; 3)详细设计:定义相应的存储结构并写出各函数的伪码算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。详细设计的结果是对数据结构和基本操作做出进一步的求精,写出数据存储结构的类型定义,写出函数形式的算法框架; 4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言,使程序中逻辑概念清楚; 5)程序调试与测试:能够熟练掌握调试工具的各种功能,设计测试数据确保程序正确。调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果; 6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算法的时间、空间复杂性分析; 7)编写课程设计报告; 指导教师(签字):教研室主任(签字): 批准日期:年月日

算术表达式求值系统

数据结构课程设计报告 课设题目:算式表达式求值系统 班级: 软件1202 姓名: 学号: 指导教师: 李斌 成绩: 2013 年1月

目录 一、需求分析 (2) 二、概要设计 (2) (一)设计思想 (2) (二)实现方法 (2) (三)模块整体设计图 (3) (四)函数功能介绍 (3) 三、详细设计 (4) (一)数据结构设计 (4) (二)模块接口设计 (4) (三)盒图 (5) 四、调试分析 (7) 五、用户手册 (7) 六、测试结果 (8) 七、附录 (9) 附录一设计体会 (9) 附录二源程序 (9)

一、需求分析 算式表达式求值是程序设计语言编译中一个最基本的问题。本次任务要求完成一个四则算式表达式求值系统。具体需求为:当用户输入一个四则算式(包括加、减、乘、除和括号),如(12+3)*2+9*4,输出其计算结果。具体要求如下:(一)要实现栈的基本操作算法,包括初始化栈、进栈、出栈等。 (二) 在本程序中,表达式中的元素限定为char型,表达式长度不超过100,表达式以“#”号为结束标志。 (三)要求程序输出表达式的计算结果。 二、概要设计 (一)设计思想 本次四则算式表达式求值的程序采用的是中缀表达式的求值的方法。所谓中缀表达式,就是指每个二目运算符在两个运算量的中间,假设所讨论的算术运算符包括:+ 、- 、*、/、%、^(乘方)和括号()。而本次程序的编写只涉及四则运算(+、-、*、/)和括号()。 设运算规则为: .运算符的优先级为:()> *、/> +、- ; .有括号出现时先算括号内的,后算括号外的,多层括号,由内向外进行; 表达式作为一个满足表达式语法规则的串存储,如表达式“3*2^(4+2*2-1*3)-5”,它的的求值过程为:自左向右扫描表达式,当扫描到3*2时不能马上计算,因为后面可能还有更高的运算,正确的处理过程是:需要两个栈:对象栈s1和算符栈s2。当自左至右扫描表达式的每一个字符时,若当前字符是运算对象,入对象栈,是运算符时,若这个运算符比栈顶运算符高则入栈,继续向后处理,若这个运算符比栈顶运算符低则从对象栈出栈两个运算量,从算符栈出栈一个运算符进行运算,并将其运算结果入对象栈,继续处理当前字符,直到遇到结束符“#”。 根据运算规则,左括号“(”在栈外时它的级别最高,而进栈后它的级别则最低了; 乘方运算的结合性是自右向左,所以,它的栈外级别高于栈内; 就是说有的运算符栈内栈外的级别是不同的。当遇到右括号“)”时,一直需要对运算符栈出栈,并且做相应的运算,直到遇到栈顶为左括号“(”时,将其出栈,因此右括号“)”级别最低但它是不入栈的。对象栈初始化为空。根据以上分析,每个运算符栈内、栈外的级别如下: 算符栈内级别栈外级别 ^ 3 4 *、/、% 2 2 +、- 1 1 ( 0 4 ) -1 -1 (二)实现方法

数据结构课程设计_表达式求值【完整版】

XXXXXX大学《数据结构》课程设计报告 班级: 学号: 姓名: 指导老师:

目录 一算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 二感想体会与总结

算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台 Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈 { char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 }; int InitStack (SqStack &s) //建立一个空栈S { if (!(s.base = (char *)malloc(50 * sizeof(char)))) exit(0); s.top=s.base; s.stacksize=50; return OK; } char GetTop(SqStack s,char &e) //运算符取栈顶元素 { if (s.top==s.base) //栈为空的时候返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK

最新《数据结构》算术表达式求值

二课程设计2——算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 三感想体会与总结 算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台 Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈 { char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 };

int InitStack (SqStack &s) //建立一个空栈S { if (!(s.base = (char *)malloc(50 * sizeof(char)))) exit(0); s.top=s.base; s.stacksize=50; return OK; } char GetTop(SqStack s,char &e) //运算符取栈顶元素 { if (s.top==s.base) //栈为空的时候返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; } int Push(SqStack &s,char e) //运算符入栈 { if (s.top-s.base >= s.stacksize) { printf("运算符栈满!\n"); s.base=(char*)realloc (s.base,(s.stacksize+5)*sizeof(char) ); //栈满的时候,追加5个存储空间 if(!s.base) exit (OVERFLOW); s.top=s.base+s.stacksize; s.stacksize+=5; } *(s.top)++=e; //把e入栈 return OK; } int Pop(SqStack &s,char &e) //运算符出栈 { if (s.top==s.base) //栈为空栈的时候,返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else {

基于栈结构的中缀表达式求值

实验3:栈与队列实验 ——基于栈结构的中缀表达式求值 一、问题描述 从键盘输入任意中缀表达式字符串,读字符串,利用栈结构实现表达式求值。 二、输入与输出 输入:从键盘中缀表达式如: 32+5×(6-4) 输出:计算结果42 三、需求分析 1.定义两个栈结构,数栈用于存放表达式中的数,符号栈用于存放表达式中的符号,实现栈的运算 2.在读数的时候考虑多位运算 3.实现表达式求值 四、开发工具与环境 硬件设备:微型计算机系统 软件环境:操作系统Windows 开发工具:Devc++ 五、概要设计 参考结构定义 typedef struct /* 运算符栈 */ { char *base,*top; int stacksize; }SqStack; typedef struct /* 运算数栈 */ { int *base,*top; int stacksize; }SqStack1; int priority[7][7]={{'>', '>', '<', '<', '<', '>', '>'}, // + {'>', '>', '<', '<', '<', '>', '>'}, // -

{'>', '>', '>', '>', '<', '>', '>'}, // * {'>', '>', '>', '>', '<', '>', '>'}, // / {'<', '<', '<', '<', '<', '=', ' '}, // ( {'>', '>', '>', '>', ' ', '>', '>'}, // ) {'<', '<', '<', '<', '<', ' ', '='} // # }; /*用于比较符号优先级的全局二维数组*/ 2.各函数模块 void InitStack(SqStack *s); 操作结果:初始化运算符栈 char GetTop(SqStack *s); 操作结果:得到运算符栈的栈顶元素 void Push(SqStack *s,char e); 操作结果:对运算符栈进行压栈操作 int IsNumber(char c); 操作结果:判断一个字符是否是数字 int MidExpression_Eval(char Express[]); 操作结果:计算中缀表达式的值 int Operate (int a,char x,int b); 操作结果:计算表达式axb,并返回结果 六、详细设计 #include #include using namespace std; /*定义区*/ #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERFLOW -1 #define ERROR 0 #define OK 1 //运算符栈 typedef struct { char *base, *top; int stacksize; }SqStack; //运算数栈 typedef struct { int *base, *top; int stacksize;

《大数据结构》算术表达式求值

实用标准文档 二课程设计2——算术表达式求值 一、需求分析 二、程序的主要功能 三、程序运行平台 四、数据结构 五、算法及时间复杂度 六、测试用例 七、程序源代码 三感想体会与总结 算术表达式求值 一、需求分析 一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。编程利用“算符优先法”求算术表达式的值。 二、程序的主要功能 (1)从键盘读入一个合法的算术表达式,输出正确的结果。 (2)显示输入序列和栈的变化过程。 三、程序运行平台

Visual C++ 6.0版本 四、数据结构 本程序的数据结构为栈。 (1)运算符栈部分: struct SqStack //定义栈 { char *base; //栈底指针 char *top; //栈顶指针 int stacksize; //栈的长度 }; int InitStack (SqStack &s) //建立一个空栈S { if (!(s.base = (char *)malloc(50 * sizeof(char)))) exit(0); s.top=s.base; s.stacksize=50; return OK; } char GetTop(SqStack s,char &e) //运算符取栈顶元素 { if (s.top==s.base) //栈为空的时候返回ERROR { printf("运算符栈为空!\n"); return ERROR; } else e=*(s.top-1); //栈不为空的时候用e做返回值,返回S的栈顶元素,并返回OK return OK; }

相关主题
文本预览
相关文档 最新文档