后缀表达式转化为前缀表达式并求值
#include
#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define OVERFLOW -2
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Selemtype;
typedef int Status;
#define MAX 50
char string1[MAX]; //定义两个字符串分别存放中缀表达式和后缀表达式char string2[MAX];
int result;
typedef struct
{
Selemtype *base; //在构造之前和销毁之后,base的值为NULL
Selemtype *top; //栈顶指针
int stacksize; //当前分配的存储空间,以元素为单位
}SqStack;
Status InitStack(SqStack *S);
Status Push(SqStack *S,Selemtype e);
Status Pop(SqStack *S,Selemtype e);
Status InitStack(SqStack *S)
{ //构造一个空栈S
S->base=(Selemtype*)malloc(STACK_INIT_SIZE*sizeof(Selemtype));
if(!S->base) return OVERFLOW; //存储分配失败
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack *S,Selemtype e)
{ //插入元素e为新的栈顶元素
if(S->top-S->base>=S->stacksize)
{ //栈满,追加存储空间
S->base=(Selemtype*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(Selemtype));
if(!S->base) return OVERFLOW; //存储分配失败
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return OK;
}
Status Pop(SqStack *S,Selemtype e)
{ //若栈不空值,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if(S->top==S->base) return ERROR;
e=*--S->top;
return OK;
}
Status StackEmpty(SqStack *S)
{ //若栈S为空,则返回TRUE,否则返回FALSE
if(S->top==S->base)
return TRUE;
else
return FALSE;
}
Selemtype GetTop(SqStack *S)
{ //取栈顶元素并用e返回其值
Selemtype e;
if(S->top==S->base) return ERROR;
e=*(S->top-1);
return e;
}
void transform(char str1[],char str2[])
{ //将中缀表达式转换为后缀表达式
SqStack Op;
InitStack(&Op); //定义一个空栈用来存放运算符
Push(&Op,'#');
Selemtype top; //取得运算符栈的栈顶元素赋值给top
Selemtype e=NULL; //出栈的栈顶元素赋值给e
int i=0,j=0,m;
char a;
m=strlen(str1);
for(i=0;i { a=str1[i]; if('0'<=str1[i]&&str1[i]<='9') //如果是操作数直接放在后缀表达式中 { str2[j]=str1[i];j++; } else { str2[j]=' '; j++; switch(a) { case '(':{ Push(&Op,a); } break; case '*': case '/': top=GetTop(&Op); if((top=='*')||(top=='/')) { Pop(&Op,e); str2[j]=top;j++; //比其高,现将栈顶运算符出栈,再进栈。 Push(&Op,a); } else { Push(&Op,a); } break; case '+': case '-': top=GetTop(&Op); if(top=='+'||top=='-'||top=='*'||top=='/') { Pop(&Op,e); str2[j]=top;j++; Push(&Op,a); } else { Push(&Op,a); } break; case ')':{ top=GetTop(&Op); Pop(&Op,e); while(top!='(') { str2[j]=top; j++; top=GetTop(&Op); Pop(&Op,e); } } break; } } } top=GetTop(&Op); Pop(&Op,e); while(top!='#') { str2[j]=top; j++; top=GetTop(&Op); Pop(&Op,e); } str2[j]=top; printf("转化后的后缀表达式为:%s\n",str2); } Selemtype counttem(char str[]) { //计算后缀表达式的值 SqStack S; InitStack(&S); int len; len=strlen(str); Selemtype A[10]; int m,n,p,e=NULL,k,E; int i,j,l,ch,zh; //zh为字符型转化为的整形数 for(i=0;i { if('0' { k=i;j=0; while('0'<=str[k]&&str[k]<='9') //将字符型的一串数字转化为整形 { A[j]=str[k]-48; j++; k++; } ch=A[j-1]; E=1; for(l=1;l { E=10*E; zh=A[j-l-1]*E; ch+=zh; } Push(&S,ch); i=k-1; } else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/') { m=GetTop(&S); Pop(&S,e); n=GetTop(&S); Pop(&S,e); switch (str[i]) { case'+': p=m+n; break; case'-': p=n-m; break; case'*': p=n*m; break; case'/': p=n/m; break; } Push(&S,p); } else if(str[i]==' ') { } else if(str[i]=='#') { result=GetTop(&S); } } printf("表达式的运算结果为:%d\n",result); return result; } void main() { printf("请输入表达式(整数的四则运算)"); gets(string1); //用字符串string1盛放中缀表达式 transform(string1,string2); //用字符串string2盛放后缀表达式counttem(string2); } 表达式求值课程设计报告 表达式求值 《数据结构》 课程设计报告 题目: 栈的应用:表达式求值 (系): 信息科学与工程学院院 专业班级: 软件工程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(培养算法分析能力。分析所设计算法的时间复杂度和空间复杂度,进一步提 高程序设计水平。 常用前缀后缀 一.表示否定的前缀 1.dis-加在名词、形容词,动词之前。 disadvantage(缺点)dishonorable(不光彩的)disagree(不同意) 2.in-加在形容词,名词之前 incorrect(不正确的),inability(无能,无力),inaccurate(不准确的) 3.im-加在字母m,b,p之前 impossible(不顺能的),impolite(不礼貌的),impudence(厚颜无耻) 4.il-加在以1开头的词前 illegal(非法的),illiterate(文盲的,无文化的)illogical(不合逻辑的) 5.ir-加在以r开头的词前 irregular(不稳定的),irresistable(不可抵抗的),irresolvable(不能分解的,不能解决的) 6.un-加在名词,形容词,副词之前 unfinished(未完成的)undoubted(无疑的)unemployment(失业) 7.non-加在形容词,名词前 non-existence(不存在),non-essential(不主要的),non-electrical(非电的) 8.mis-加在动词、名词之前 misunderstand(误解),misjudge(误判),misleading(误导),misfortune(不幸) 9.de-加在名词,形容词之前 demobilize(遣散;使…复员) decolor (脱色, 漂白) 10.anti-加在名词、形容词之前 anti-Japanese(抗日战争),anti-social(厌恶社会的,反社会的),antidite(解毒药) 11.counter-加在名词、动词前 counterattack(反攻,反击),counteract(抵抗,阻碍)counterrevolution(反革命) 二.表示“前before”的前缀 1.pre- preconception(成见),pre-exsiting(先于……而存在的),pre-selection(选举前的) preface(前言) 2.ante- anteroom(前室,接待室),antecessor(先行者,先驱者) 3.fore- forehaed(前额),foreground(前景),foreman(工头,领班),foresee(预见,先见),foretell(预言) 4.pro- programme(计划),prologue(序幕) 5.ex- ex-president(前任总统)ex-wife(前妻) 三.表示“后-post”的前缀 1.post- post-war(战后),post-position(后置词),postmeridian(下午) 四.表示“低”、“下”的前缀 1.hypo- hypocrisy(伪善,虚伪),hypothesis(假设),pypocholoride(次氯酸盐) 2.Infra- infra-red(红外线),infrahuman(低于人类的),infrasonic(亚声的,次声的) 3.sub- sub-editou(副编辑),sub-way(地铁),sub-conscious(下意识的),submarine(海下的),subtropical(亚热带的),subtitle(副标题) 一、设计思想 首先,将中缀表达式转换为后缀表达式。转换算法思路:设中缀表达式已存入数组E[n];由于后缀表达式中操作数的次序与中缀表达式一致,故扫描到中缀表达式操作数时直接输出到B[n]即可;对于运算符,视其优先级别,优先级高的运算符先输出;设一存放运算符的栈s,先将s置空;依次扫描E[n]中各分量E[i]送x: 若x=“”(结束符),依次输出栈s中运算符,转换结束; 若x=操作数,直接输出x到B[n]中; 若x=‘)’,反复退栈输出栈s中子表达式运算符,直到栈顶符=‘(’,并退掉栈顶的‘(’; 若x=操作符,反复退栈输出栈s中运算符,直到栈顶符 三、源代码 下面给出的是用后缀表达式求值算法实现的程序的源代码: #include 实验表达式求值问题 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<<"栈创建失败,退出!"< 英语中的派生词的构成主要有三种:合成(由两个或两个以上的单词合成的单词);派生(指一个词根加上前缀或后缀构成的单词);转化(一种词性转化成另一种或几种词性的单词)。本文重点通过对前缀和后缀的剖析解读派生词的意义和特点。 先看下表: 一、前缀 1. dis- 表示意义相反,主要用在动词之前,间或用于名词或形容词前。如: appear (v.出现) → disappear (v.消失), 再如: dislike不喜欢 discover 发现 disobey不遵从 disbelieve 不相信 dishonest(adj.)不诚实的 disadvantage (n.) 不利条件,缺点 2. in-, im-, un-, il-, ir-用在形容词前,表示否定意义。如: indirect 间接的 incorrect 不正确的 inactive 不活动的 impossible 不可能的 unable 不能的 unhealthy 不健康的 unsuccessful 不成功的 uncommon不普通的 unpleasant令人不快的 unfortunate不幸的 irregular不规则的 illegal非法的 invisible看不见的 3. re- 表示“重新,再”,用在动词前。如: rebuild 重新建造 recycle 再循环 reconsider 重新考虑 review 复习二、后缀 I.形容词后缀 1. -able (n./v.→adj.)表示“可以……的;显示……性质”。如:respectable 可敬的 eatable 可吃的 comfortable 舒服的 valuable 有价值的 fashionable 时髦的 loveable 可爱的 2. -ful (n./v.→adj.) 表示“充满……的”。如: beautiful 漂亮的 successful 成功的 wonderful 精彩的 mouthful 满嘴的 shameful 可耻的 hopeful 充满希望的 3. -less (n.→adj.) 表示“没有……的”。如: jobless 无业的 cordless 无线的 homeless 无家可归的 helpless 无助的 4. -ous (n.→adj.)表示“具有……性质的”。如: nervous 紧张的 famous 著名的 dangerous 危险的 poisonous 有毒的 mountainous 山区的 humorous 幽默的 一、设计思想 计算算数表达式并求值,采取的共有两种方法: 1.先将算数表达式转化为后缀表达式,然后对后缀表达式进行计算。 2.对算数表达式进行直接的计算。 第一种算法 这种解决方案又分为两步: 1.将表达式先转化为后缀表达式的字符串数组 2.利用后缀表达式进行计算 在转化过程中,第一,建立一个存符号的栈,和一个字符串数组,用来存放转化以后的表达式 然后,对于得到的用户输入的字符串进行逐个的扫描,如果是数组或者小数点,则直接存放到数组中,并且在后面加入一个分隔符,如果是操作符,则和栈中的已存的进行比较,如果比栈中的操作符的优先级高,则直接入栈,如果优先级低或相等,则栈中元素出栈,存到字符串中,然后再次检查栈顶,直到栈中元素的优先级低于扫描操作符,则此操作符入栈,然后扫描下一个字符,直到遇到字符串的结束符号\0,扫描结束。数组中存的就是后缀表达式。得到后缀表达式后,进行计算,要用到数值栈。首先要将字符表示的数字转化为浮点小数,然后进行扫描,遇到数值,放入栈中,遇到操作符,就从栈中取出两个数,进行计算后再放入栈中,扫描下一个,最后的计算结果就存到了栈中,直接取出栈内元素,就是计算的最后结果。 第二种算发 首先要建立两个栈,一个用来存放操作符,一个用来存放数值。开始对用户输入的字符串进行扫描,如果是数字字符或者小数点,则将字符转化为浮点数存到数栈里,如果是操作符,则观察符号栈,如果栈顶元素的优先级低于观察的操作符,则操作符入栈,如果栈顶元素的优先级高于或者等于观察的操作符,则从数值栈中取出两个浮点数,从符号栈中取出栈顶的操作符,然后进行相应的数值计算,所得的结果再存到数值栈中,重复这样的操作,直到符号栈中栈顶元素的优先级低于观察的操作符,则此操作符入栈,然后对下一个字符进行扫描。如果是左括号,则不进行优先级的比较,直接入栈,入栈后优先级为-1。如果是右括号,则从数值栈中取两个操作数,符号栈中取出一个符号,然后进行计算后得数放入数栈中,不断进行此类操作,直到从栈中取出的是左括号为止,左括号去掉,扫描下一个。扫描结束后,计算也结束了,计算的结果就存放在数值栈中,最后把数值栈中的数取出,就是所得的计算结果。 容错的算法简要: 括号匹配:当扫描到左括号是,左括号直接入栈,扫描到右括号时,则左括号出栈,如果栈为空,则右括号多,如果最后栈中还有括号,则左括号多。给出错误提示。 除数不为0:当扫描到'/'时,就判断其后面的数字是否为0,如果为0报错。 取余运算:取余运算时,操作数判断是否为整数,不为整数报错。 二、算法流程图 第一种算法:先将表达式转化为后缀表达式,然后计算 其主函数流程图为: 一、常用的前缀和后缀 1、常用前缀 aero-:concerning the air of aircraft plane—aeroplane space—aerospace anti-:against;opposite of nuclear—antinuclear matter—antimatter war—antiwar auto-:of or by oneself biography—autobiography criticism—autocriticism be-:to treat as the stated thing friend—befriend little—belittle bi-:two;twice;double lingual—bilingual cycle—bicycle bio-:concerning living things chemistry—biochemistry sphere—biosphere by-,bye-:less important produce—by-produce way—byway centi-:hundredth part grade—centigrade meter—centimeter co-:together,with author—coauthor exist—coexist col-:( used before l ) together,with location—collocation com-:( used before b,m,p ) together,with passion—compassion con-:together,with centric—concentric federation—confederation contra-:opposite diction—contradiction natural—contranatural cor-:( used before r ) together,with relate—correlate respond—correspond counter-:opposite act—counteract attack—counterattack cross-:across;going between the stated things and joining them country—crosscountry breed—crossbreed de-:showing an opposite;to remove;to reduce code—decode value—devalue dis-:not;the opposite of advantage—disadvantage agree—disagree honest—dishonest em-:( used before b,m,p ) to cause to become body—embody power—empower en-:to cause to become;to make danger—endanger large—enlarge ex-:former ( and still living ) minister—ex-minister wife—ex-wife #include 第 3 章运算符和表达式 运算符指明对操作数所进行的运算。按操作数的数目来分,可以有一元运算 符 (如 ++、--,二元运算符(如 +、>和三元运算符 (如?:,它们分别对应于一个、两个和三个操作数。对于一元运算符来说 ,可以有前缀表达式 (如++i 和后缀表达式 (如 i++,对于二元运算符来说则采用中缀表达式(如a+b。按照运算符功能来分,基本的运算符有下面几类 : 1.算术运算符 (+,-,*,/,%,++,-- 2.关系运算符 (>,<,>=,<=,==,!= 3.布尔逻辑运算符 (!,&&,|| 4.位运算符 (>>,<<,>>>,&,|,^,~ 5.赋值运算符 (=,及其扩展赋值运算符如+= 6.条件运算符 ( ?: 7.其它 (包括分量运算符·,下标运算符 [],实例运算符 instance of,内存分配运算符new,强制类型转换运算符(类型,方法调用运算符 ( 等 本章中我们主要讲述前6类运算符。 § 3.1算术运算符 算术运算符作用于整型或浮点型数据 ,完成算术运算。 一、二元算术运算符 如下表所示运算符用法描述 + op1+op2 加 - op1-op2 减 * op1*op2 乘 / op1/op2 除 % op1%op2 取模(求余 Java对加运算符进行了扩展,使它能够进行字符串的连接 ,如 "abc"+"de",得到 串 "abcde"。我们将在第七章中讲解。与C、 C++不同,对取模运算符%来说,其操作数可以为浮点数, 如 37.2%10=7.2。 二、一元算术运算符 如下表所示 : 运算符用法描述 + +op 正值 - -op 负值 ++ ++op,op++ 加1 -- --op,op-- 减1 i++与 ++i的区别 i++在使用i之后,使 i的值加 1,因此执行完 i++后,整个表达式的值为 i,而 i的值变为 i+1。 ++i在使用i之前,使 i的值加 1,因此执行完 ++i后 ,整个表达式和 i的值均为 i+1。 对 i--与 --i同样。 例 3.1.下面的例子说明了算术运算符的使用 public class ArithmaticOp{ public static void main( String args[] { int a=5+4; //a=9 int b=a*2; //b=18 int c=b/4; //c=4 int d=b-c; //d=14 int e=-d; //e=-14 int f=e%4; //f=-2 double g=18.4; 汇编语言实训课程设计任务书 题目:表达式求值程序班级:计算机科学与技术一班 学生姓名:赵旭尧学号: 14730141 题目类型:软件工程(R)指导教师:刘树群 一.题目简介 该设计要求学生使用汇编语言,设计并开发出针对四则运算表达式进行求 值的命令行或窗口程序。 通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对汇 编语言基本语言要素和流程结构的理解,针对汇编语言中的重点和难点内容进 行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。 得到软件工程的综合训练,提高解决实际问题的能力。 二.设计任务 1、查阅文献资料,一般在5篇以上; 2、通过键盘输入表达式,进行针对整数的“加减乘除”四则运算表达式 进行求值,有良好的界面; 3、完成软件结构设计和算法设计; 4、完成系统的软件开发和测试工作; 5、撰写设计说明书; 6、做好答辩工作。 三.主要内容、功能及技术指标 1、实现功能及指标:①使用Win32的窗口程序模式,实现表达式求值程序 及测试界面程序的设计与开发;②支持整数的四则运算、位运算和小括号等; ③使用文本框对表达式进行交互式编辑和输出。 2、问题分析及解决方案框架确定:充分地分析和理解问题本身,弄清要求 做什么。在确定解决方案框架过程中,综合考虑系统功能,考虑怎样使系统结 构清晰、合理、简单和易于调试。最后确定每个过程和函数的简单功能,以及 过程(或函数)之间的调用关系,并画出函数之间的调用关系图。 3、详细设计和编码:定义相应的存储结构,确定各个函数的算法,并画出 流程图,在此基础上进行代码设计,每个明确的功能模块程序一般不超过200 行,否则要进一步划分。 英语中常用的前缀和后缀 aero:concerning the air or aircraft plane(飞机)—aeroplane(飞机) space(空间, 间隔)—aerospace(航空宇宙) anti: against;opposite of nuclear([核]核子的)—antinuclear(反对使用核武器的) matter(物质)—antimatter(反物质) war(战争、作战、打仗)—antiwar(反战的, 反对战争的) auto: of or by oneself biography(传记)—autobiography(自传) criticism(批评, 批判)—autocriticism(自我反省, 自我检讨) be:to treat as the stated thing friend(朋友, 助手)—befriend(待人如友, 帮助) little(很少的, 矮小的,很少)—belittle(轻视, 使渺小, 使...显得渺小)bi: two;twice;double lingual(语言的)—bilingual(能说两种语言的) cycle(自行车)—bicycle(脚踏车, 自行车) bio:concerning living things chemistry(化学)—biochemistry(生物化学) sphere(圈子)—biosphere(生物圈) by—:less important product(产品, 产物,)—by-product(副产品, 附加产物) way(路,道路)—byway(小道) centi: hundredth part grade(等级)—centigrade(分为百度的, 百分度的, 摄氏温度的)meter(米)—centimeter(厘米) co: together, with author(作家, 创造者)—coauthor(合著者, 共同执笔者,合著)exist(存在, 生存)—coexist(共存) col:(used before l) together, with location(位置, 场所)—collocation(排列, 配置) com:(used before b, m, p)together, with passion(激情, 热情)—compassion(同情,怜悯) #include c语言实现中缀,后缀,前缀表达式转 换并求值 c语言实现中缀,后缀,前缀表达式转换并求值九#include #include #define MAXNUM 100 typedef struct Node//定义存储中缀表达式的结点类型{int data; int data1; char data2; struct Node *next; }Lnode; typedef struct Node2//定义存储前缀表达式的结点类型{int data; int data1; char data2; struct Node2 *next; struct Node2 *prior; }Lnode2; typedef int selemtype1;//定义运算数栈的结点typedef struct//定义运算数栈的类型{selemtype1 *base; selemtype1 *top; }sqstack1; void InitStack1(sqstack1 &s)//新建一个空运算数栈{=(selemtype1 *)malloc(MAXNUM*sizeof(selemtype1)); =; if(!) printf(“出错:申请空间失败!\\n”); } void Push1(sqstack1 &s,selemtype1 &e)//运算数栈,入栈:插入元素e为新的栈顶元素{ if(>=MAXNUM) printf(“出错:表达式过长!1\\n”); *++ =e; } void GetTop1(sqstack1 s,selemtype1 &e)//运算数栈,用e返回栈顶元素{e=*(); } void Popopnd1(sqstack1 &s,selemtype1 &e) //运算数栈,退栈:删除栈顶元素,并用e返回其值{e=*--; } int stackempy1(sqstack1 s) //运算数栈,若为空栈返回1,否则返回0 {if(==) return 1; else return 0; } typedef char selemtype2;//定义运算符栈的结点类型typedef struct//定义运算符栈类型{selemtype2 *base; selemtype2 *top; }sqstack2; void InitStack2(sqstack2 &s)//新建一个空运算符栈{=(selemtype2 *)malloc(MAXNUM*sizeof(selemtype2)); =; if(!) printf(“出错:申请空间失败! 1 / 5 英语中的派生词的构成主要有三种: 合成(由两个或两个以上的单词合成的单词);派生(指一个词根加上前缀或后缀构成的单词);转化(一种词性转化成另一种或几种词性的单词)。本文重点通过对前缀和后缀的剖析解读派生词的意义和特点。 先看下表: 词缀 特点 类别前缀通常不改 变词性词义词类 agree (v.)→ disagree(v.) 同意→不同意 health (n.)→ healthy (adj.) 健康→健康的 care (n.)→ careless (adj.) 小心→粗心的 意义改变后缀一般改变 2 / 5 词性词义改变不 大, 但否定意义后 缀除外 一、前缀 1. dis-表示意义相反,主要用在动词之前,间或用于名词或形容词前。如: appear (v.出现) →disappear (v.消失), 再如: dislike不喜欢discover发现disobey不遵从disbelieve不相信dishonest(adj.)不诚实的disadvantage (n.)不利条件,缺点2. in-, im-, un-, il-, ir-用在形容词前,表示否定意义。如:indirect间接的incorrect不正确的inactive不活动的impossible不可能的unable不能的unhealthy不健康的unfortunate不幸的irregular不规则的illegal非法的 invisible看不见的 3. re-表示“重新,再”,用在动词前。如: rebuild重新建造recycle再循环reconsider重新考虑review复习二、后缀 I.形容词后缀 1. -able (n./v.→adj.)表示“可以??的;显示??性质”。如:valuable有价值的fashionable时髦的loveable可爱的 3 / 5 2. -ful (n./v.→adj.) 表示“充满??的”。如: beautiful漂亮的successful成功的wonderful精彩的 mouthful满嘴的shameful可耻的hopeful充满希望的 #include v.push_back(s[i]); v.push_back(' '); } else if (s[i] == '(') { stk.push(s[i]); } else if (s[i] == ')') { while(stk.top() != '(') { v.push_back(stk.top()); v.push_back(' '); stk.pop(); } stk.pop(); } else if (IsOperator(s[i])) { if (!stk.empty()) { while(!stk.empty() && priority(s[i]) <= priority(stk.top())) { v.push_back(stk.top()); v.push_back(' '); stk.pop(); } } stk.push(s[i]); } i++; } while(!stk.empty()) { v.push_back(stk.top()); v.push_back(' '); stk.pop(); } } bool compute(vector 数据结构课程设计 后缀表达式求值 题目:后缀表达式求值 指导老师:高攀 姓名:顾力雄 学院:信息科学与技术学院 专业:计算机科学与技术专业 班级:计科2008级(1)班 学号:2008082258 时间:2009年3月28日 课程设计报告 一、题目:后缀表达式求值; 二、设计目的 1、掌握类模板的应用 2、掌握栈的操作 3、掌握 三、设计内容和要求 运用栈模板在求值过程顺序扫描后缀表达式,每次遇到操作数便将它压入堆栈;遇到运算符,则从栈中弹出两个操作数进行计算,然后再把结果压入堆栈,等到扫描结束时,输出结果,有加减乘除、平方根、sin、cos、tan、arcsin、arcos、arctan、取余、幂运算等等算术。 四、程序结构 后缀表达式 扫描并判断数据类型 运算符则从栈中 取数进行运算数字压入栈中 栈 结果压入栈中输出栈最终结果 五、运行图 参考文献: 刘振鹏编,数据结构(第二版),北京铁道出版社,2007.; 谭浩强编,C++程序设计,北京,清华大学出版社,2004.; 徐晓凯编,数据结构实用教程,第二版,北京,清华大学出版社。 附录:源文件 头文件myStack.h: #ifndef H_StackType #define H_StackType #include 专升本常用前缀和后缀 1.常用前缀 aero:concerning the air or aircraft plane(飞机)—aeroplane(飞机) space(空间, 间隔)—aerospace(航空宇宙) anti: against;opposite of nuclear([核]核子的)—antinuclear(反对使用核武器的) matter(物质)—antimatter(反物质) war(战争、作战、打仗)—antiwar(反战的, 反对战争的) auto: of or by oneself biography(传记)—autobiography(自传) criticism(批评, 批判)—autocriticism(自我反省, 自我检讨) be:to treat as the stated thing friend(朋友, 助手)—befriend(待人如友, 帮助) little(很少的, 矮小的,很少)—belittle(轻视, 使渺小, 使...显得渺小)bi: two;twice;double lingual(语言的)—bilingual(能说两种语言的) cycle(自行车)—bicycle(脚踏车, 自行车) bio:concerning living things chemistry(化学)—biochemistry(生物化学) sphere(圈子)—biosphere(生物圈) by—:less important product(产品, 产物,)—by-product(副产品, 附加产物) way(路,道路)—byway(小道) centi: hundredth part grade(等级)—centigrade(分为百度的, 百分度的, 摄氏温度的) meter(米)—centimeter(厘米) co: together, with author(作家, 创造者)—coauthor(合著者, 共同执笔者,合著) exist(存在, 生存)—coexist(共存) col used before l) together, with location(位置, 场所)—collocation(排列, 配置) com used before b, m, p)together, with passion(激情, 热情)—compassion(同情,怜悯) con:together, with centric(中心的, 中央的)—concentric(同中心的) federation(同盟, 联邦, 联合, 联盟)—confederation(联邦) contra pposite diction(措辞, 用语, 言语)—contradiction(反驳, 矛盾) 它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4 5 6 前缀表达式 3 4 + 5 × 6 - 后缀表达式 中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。 前缀表达式(前缀记法、波兰式) 前缀表达式的运算符位于操作数之前。 前缀表达式的计算机求值: 从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。 例如前缀表达式“- × + 3 4 5 6”: (1) 从右至左扫描,将6、5、4、3压入堆栈; (2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈; (3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈; (4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。 可以看出,用计算机计算前缀表达式的值是很容易的。 将中缀表达式转换为前缀表达式: 遵循以下步骤: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从右至左扫描中缀表达式; (3) 遇到操作数时,将其压入S2; (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: (4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈; (4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1; (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; (5) 遇到括号时:表达式求值课程设计报告
(完整版)常用前缀后缀
后缀表达式求值
数据结构课程设计_表达式求值问题
最常见的前缀和后缀
C语言 后缀表达式计算
常用的前缀和后缀
后缀表达式求值的算法及代码
[java入门学习]第 3 章 运算符和表达式.
表达式求值程序设计说明书
英语中常用的前缀和后缀
后缀表达式转化为前缀表达式并求值
c语言实现中缀,后缀,前缀表达式转换并求值
最常见的前缀和后缀
后缀表达式的计算
后缀表达式求值_数据结构设计
常用前缀和后缀
数学表达式解析(前缀中缀后缀)