C语言实现中缀、后缀、前缀表达式 相互转化并求值

C语言实现中缀、后缀、前缀表达式 相互转化并求值
C语言实现中缀、后缀、前缀表达式 相互转化并求值

1.问题描述

(1)表达式求值问题

表达式是数据运算的基本形式。人们的书写习惯是中缀式,如:11+22*(7-4)/3。中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀式(如:22 7 4 - * 3 / 11 +)和前缀式(如:+ 11 / * 22 – 7 4 3)。后缀表达式和前缀表达式中没有括号,给计算带来方便。如后缀式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。

2.数据结构设计

(1)表达式求值问题

由于表达式中有字符与数字两种类型,故定义结点一个标志域data,标志结点存储的为字符data=2还是数字data=1,再寻找结点中对应的存储位置,读取数字域data1,字符域data2。而在前缀表达式时,存在表达式逆序,因表达式类型不统一,用栈逆序极不方便,选择构建双向链表,存储表达式。

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;

3.运行、测试与分析

(1)表达式求值问题

(1)按提示输入中缀表达式,如图1.1所示。如输入中缀表达式不正确,提示输入有误,如图1.2,1.3所示。

图1.1

图1.2

图1.3

(2)选择表达式转换并求值方式。按“1”选择中缀表达式求值,如图1.4所示。

图1.4

(3)按“2”选择中缀表达式转变为后缀表达式并求值,如图1.5所示。

图1.5

(4)按“3”选择中缀表达式转变为前缀表达式并求值,如图1.6所示。

图1.6

附录:源代码

(1)表达式求值问题

#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) //新建一个空运算数栈

{s.base=(selemtype1 *)malloc(MAXNUM*sizeof(selemtype1)); s.top=s.base;

if(!s.base) printf("出错:申请空间失败!\n");

}

void Push1(sqstack1 &s,selemtype1 &e) //运算数栈,入栈:插入元素e为新的栈顶元素

{ if(s.top-s.base>=MAXNUM)

printf("出错:表达式过长!1\n");

*s.top++ =e;

}

void GetTop1(sqstack1 s,selemtype1 &e) //运算数栈,用e返回栈顶元素

{e=*(s.top-1);

}

void Popopnd1(sqstack1 &s,selemtype1 &e) //运算数栈,退栈:删除栈顶元素,并用e返回其值

{e=*--s.top;

}

int stackempy1(sqstack1 s) //运算数栈,若为空栈返回1,否则返回0

{if(s.top==s.base) return 1;

else return 0;

}

typedef char selemtype2; //定义运算符栈的结点类型

typedef struct //定义运算符栈类型

{selemtype2 *base;

selemtype2 *top;

}sqstack2;

void InitStack2(sqstack2 &s) //新建一个空运算符栈

{s.base=(selemtype2 *)malloc(MAXNUM*sizeof(selemtype2));

s.top=s.base;

if(!s.base) printf("出错:申请空间失败!\n");

}

void Push2(sqstack2 &s,selemtype2 &e) //运算符栈,入栈:插入元素e为新的栈顶元素

{ if(s.top-s.base>=MAXNUM)

printf("出错:表达式过长!2\n");

*s.top++ =e;

}

void GetTop2(sqstack2 s,selemtype2 &e) //运算符栈,用e返回栈顶元素

{e=*(s.top-1);

}

void Popopnd2(sqstack2 &s,selemtype2 &e) //运算符栈,退栈:删除栈顶元素,并用e返回其值

{e=*--s.top;

}

int stackempy2(sqstack2 s) //运算符栈,若为空栈返回1,否则返回0

{if(s.top==s.base) return 1;

else return 0;

}

void priority(char c,int &i) //确定运算符优先级

{if (c=='*'||c=='/'||c=='%') i=2 ;

else if (c=='+'||c=='-') i=1 ;

else i=0;

}

int compare(char a,char b) //比较栈顶元素运算符与外部运算符优先级大小,外部优先级大则返回1,反之返回0

{int in,out;

priority(a,in);

priority(b,out);

if(out>in) return 1;

else return 0;

}

void Operat(sqstack1 &OPND,sqstack2 &OPTR)

{int num1,num2,num;

char c;

Popopnd1(OPND,num2);

Popopnd1(OPND,num1);

Popopnd2(OPTR,c);

switch(c)

{case '+':num=num1+num2;break;

case '-':num=num1-num2;break;

case '*':num=num1*num2;break;

case '/':num=num1/num2;break;

case '%':num=num1%num2;break;

}

Push1(OPND,num);

}

void Operatqianzhui(sqstack1 &OPND,sqstack2 &OPTR)

{int num1,num2,num;

char c;

Popopnd1(OPND,num1);

Popopnd1(OPND,num2);

Popopnd2(OPTR,c);

switch(c)

{case '+':num=num1+num2;break;

case '-':num=num1-num2;break;

case '*':num=num1*num2;break;

case '/':num=num1/num2;break;

case '%':num=num1%num2;break;

}

Push1(OPND,num);

}

void houzhuiqiuzhi(Lnode *p,int &e) //后缀表达式求值{sqstack1 OPND; //运算数栈

sqstack2 OPTR; //运算符栈

int n;

char c;

p=p->next;

InitStack1(OPND);

InitStack2(OPTR);

while(p)

{switch(p->data)

{case 1:n=p->data1;

Push1(OPND,n);

break;

case 2:c=p->data2;

Push2(OPTR,c);

Operat(OPND,OPTR);

break;

default:printf("结点有误");

break;

}

p=p->next;

}

Popopnd1(OPND,n);

e=n;

}

void zhongzhui(Lnode *p) //中缀表达式求值{sqstack1 OPND; //运算数栈

sqstack2 OPTR; //运算符栈

int n;

char c,c2;

Lnode *first;

first=p;

p=p->next;

InitStack1(OPND);

InitStack2(OPTR);

while(!stackempy2(OPTR)||p)

{while(p)

{switch(p->data)

{case 1:n=p->data1;

Push1(OPND,n);

break;

case 2:c=p->data2;

if(stackempy2(OPTR)) Push2(OPTR,c);

else { switch(c)

{case '(': Push2(OPTR,c);break;

case ')': GetTop2(OPTR,c2);

while(c2!='(')

{Operat(OPND,OPTR);

GetTop2(OPTR,c2);}

Popopnd2(OPTR,c2);

break;

default: GetTop2(OPTR,c2);

if(compare(c2,c)) Push2(OPTR,c);

else { Operat(OPND,OPTR);

Push2(OPTR,c);

}

break;

}

}

break;

default: printf("结点有误");

break;

}

p=p->next;

}

while(!stackempy2(OPTR))

Operat(OPND,OPTR);

}

Popopnd1(OPND,n);

p=first->next;

while(p)

{if(p->data==1) printf("%d ",p->data1);

if(p->data==2) printf("%c",p->data2);

p=p->next;

}

printf("=%d ",n);

}

void houzhui(Lnode *p) //中缀表达式转化为后缀表达式

{sqstack2 OPTR; //运算符栈

Lnode *r,*q,*head;

int n;

char c,c2;

InitStack2(OPTR);

p=p->next;

q=(Lnode*)malloc(sizeof(struct Node));

head=q;

while(p)

{ switch(p->data)

{case 1:n=p->data1;

r=(Lnode*)malloc(sizeof(struct Node));

q->next=r;

q=q->next;

q->data=1;

q->data1=n;

break;

case 2:c=p->data2;

if(stackempy2(OPTR)) Push2(OPTR,c);

else { switch(c)

{ case '(': Push2(OPTR,c);break;

case ')': Popopnd2(OPTR,c2);

while(c2!='(')

{ r=(Lnode*)malloc(sizeof(struct Node));

q->next=r;

q=q->next;

q->data=2;

q->data2=c2;

Popopnd2(OPTR,c2);

}

break;

default: GetTop2(OPTR,c2);

while(!compare(c2,c))

{ Popopnd2(OPTR,c2);

r=(Lnode*)malloc(sizeof(struct Node));

q->next=r;

q=q->next;

q->data=2;

q->data2=c2;

GetTop2(OPTR,c2);

}

Push2(OPTR,c);

break;

}

}

break;

default: printf("结点有误");

break;

}

p=p->next;

}

while(!stackempy2(OPTR))

{ Popopnd2(OPTR,c2);

r=(Lnode*)malloc(sizeof(struct Node));

q->next=r;

q=q->next;

q->data=2;

q->data2=c2;

}

q->next=NULL;

q=head->next;

while(q)

{if(q->data==1) printf("%d ",q->data1);

if(q->data==2) printf("%c",q->data2);

q=q->next;

}

houzhuiqiuzhi(head,n);

printf("=%d ",n);

}

void qianzhuiqiuzhi(Lnode2 *p,int &e) //前缀表达式求值{sqstack1 OPND; //运算数栈

sqstack2 OPTR; //运算符栈

int n;

char c;

Lnode2 *head;

head=p;

p=p->next;

InitStack1(OPND);

InitStack2(OPTR);

while(p!=head)

{switch(p->data)

{case 1:n=p->data1;

Push1(OPND,n);

break;

case 2:c=p->data2;

Push2(OPTR,c);

Operatqianzhui(OPND,OPTR);

break;

default:printf("结点有误");

break;

}

p=p->next;

}

Popopnd1(OPND,n);

e=n;

}

void qianzhui(Lnode *p) //中缀表达式转化为前缀表达式

{sqstack2 OPTR; //运算符栈

InitStack2(OPTR);

int n;

char c,c2;

Lnode *first;

Lnode2 *q,*head,*r,*head2,*s;

first=p;

p=p->next;

q=(Lnode2*)malloc(sizeof(struct Node2)); //建立存中缀表达式的双向循环链表

head=q;

while(p)

{r=(Lnode2*)malloc(sizeof(struct Node2));

q->next=r;

r->prior=q;

q=q->next;

q->data=p->data;

q->data1=p->data1;

q->data2=p->data2;

p=p->next;

}

q->next=head;

head->prior=q;

s=(Lnode2*)malloc(sizeof(struct Node2)); //建立存前缀表达式的双向循环链表

head2=s;

while(q!=head)

{switch(q->data)

{case 1:n=q->data1;

r=(Lnode2*)malloc(sizeof(struct Node2));

s->next=r;

r->prior=s;

s=s->next;

s->data=1;

s->data1=n;

break;

case 2:c=q->data2;

if(stackempy2(OPTR)) Push2(OPTR,c);

else

{ GetTop2(OPTR,c2);

if(c2==')') Push2(OPTR,c);

else{ switch(c)

{ case ')':Push2(OPTR,c);break;

case '(': Popopnd2(OPTR,c2);

while(c2!=')')

{ r=(Lnode2*)malloc(sizeof(struct Node2));

s->next=r;

r->prior=s;

s=s->next;

s->data=2;

s->data2=c2;

Popopnd2(OPTR,c2);

}

break;

default: GetTop2(OPTR,c2);

while(!compare(c2,c))

{ Popopnd2(OPTR,c2);

r=(Lnode2*)malloc(sizeof(struct Node2));

s->next=r;

r->prior=s;

s=s->next;

s->data=2;

s->data2=c2;

GetTop2(OPTR,c2);

}

Push2(OPTR,c);

break;

}

}

}

break;

default:printf("结点有误");

break;

}

q=q->prior;

}

while(!stackempy2(OPTR))

{ Popopnd2(OPTR,c2);

r=(Lnode2*)malloc(sizeof(struct Node2));

s->next=r;

r->prior=s;

s=s->next;

s->data=2;

s->data2=c2;

}

s->next=head2;

head2->prior=s;

while(s!=head2)

{if(s->data==1) printf("%d ",s->data1); if(s->data==2) printf("%c",s->data2); s=s->prior;

}

qianzhuiqiuzhi(head2,n);

printf("=%d ",n);

}

int main()

{ char n[10];

char c;

int i,j,k,a,b,z,y,e;

Lnode *p,*q,*first;

i=0;e=1;a=0;b=1;z=0;y=0;

p=(Lnode*)malloc(sizeof(struct Node)); first=p;

printf("请输入中缀表达式");

do

{ c = getchar();

if('0'<=c&&c<='9')

{ n[i]=c;

i++;

}

else

{ switch (c)

{ case '+':

case '-':

case '*':

case '/':

case '%':

case '(':

case ')':

case '\n':

{ if(n[0]>'0'&&n[0]<='9')

{ q=(Lnode*)malloc(sizeof(struct Node));

p->next=q;

p=p->next;

for(k=0;k

{ for(j=0;j<=i-k-2;j++)

e=e*10;

a=a+(n[k]-'0')*e;

e=1;

n[k]='0';

}

p->data=1;

p->data1=a;

i=0;a=0;

}

if(c!='\n')

{ if(p->data==2)

{ if(p->data2!=')'&&c!='(')

b=0;

}

q=(Lnode*)malloc(sizeof(struct Node));

p->next=q;

p=p->next;

p->data=2;

p->data2=c;

if(c=='(') z++;

if(c==')') y++;

}

}

default:

if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='%'&&c!='\n'&&c!='('&&c!=')')

b=0;

}

}

}while (c != '\n');

if(z!=y) b=0;

p->next=NULL;

if(b==0)

printf("输入中缀表达式有误");

else

{printf("输入1中缀表达式求值,输入2后缀表达式求值,输入3前缀表达式求值");

scanf("%d",&b);

if(b==1) zhongzhui(first);

if(b==2) houzhui(first); if(b==3) qianzhui(first); }

return 1;

}

(完整版)常用前缀后缀

常用前缀后缀 一.表示否定的前缀 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(副标题)

中缀表达式求值

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

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

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

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

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

最常见的前缀和后缀

英语中的派生词的构成主要有三种:合成(由两个或两个以上的单词合成的单词);派生(指一个词根加上前缀或后缀构成的单词);转化(一种词性转化成另一种或几种词性的单词)。本文重点通过对前缀和后缀的剖析解读派生词的意义和特点。 先看下表: 一、前缀 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.问题描述 表达式是数据运算的基本形式。人们的书写习惯是中缀式,如: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<<"栈创建失败,退出!"<

C语言 后缀表达式计算

一、设计思想 计算算数表达式并求值,采取的共有两种方法: 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

[java入门学习]第 3 章 运算符和表达式.

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

表达式求值

《数据结构(C++版)》课设计报告2012—2013学年第一学期 课程名称数据结构 设计题目表达式求值 专业班级 姓名 学号 指导教师

课程设计题目:表达式求值 一、问题描述 对一个合法的中缀表达式求值。简单起见,假设表达式只包含+,-,*,/等4个双目运算符,且运算符本身不具有二义性,操作数均为一位整数。 二、基本要求 1.正确解释表达式; 2.符合四则运算规则; 3.输出最后的计算结果。 三、概要设计 对中缀表达式求值,通常使用“算符优先算法”。根据四则运算规则,在运算的每一步中,任意两个相继出现的运算符t和c之间的优先关系至多是下面三种关系之一: (1) t的优先级低于c; (2) t的优先级等于c; (3) t的优先级高于c。 为实现算符优先算法,可以使用两个工作栈:一个栈OPTR存放运算符;另一个栈OPND存放操作数,中缀表达式用一个字符串数组存储。 四、详细设计 利用类模板 #include using namespace std; const int StackSize=100; template //定义模板类SeqStack class SeqStack{ public: SeqStack( ) ; //构造函数,栈的初始化 ~SeqStack( ); //析构函数 void Push(DataType x); //将元素x入栈 DataType Pop( ); //将栈顶元素弹出 DataType GetTop( ); //取栈顶元素(并不删除) int Empty( ); //判断栈是否为空 void Printf(); private: DataType data[StackSize]; //存放栈元素的数组 int top; //栈顶指针,指示栈顶元素在数组中的下标 }; template

英语中常用的前缀和后缀

英语中常用的前缀和后缀 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(同情,怜悯)

c语言实现中缀,后缀,前缀表达式转换并求值

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(“出错:申请空间失败!

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

嘉应学院计算机学院 实验报告 课程名称:数据结构课程设计 开课学期:2017-2018学年第2学期 班级: 指导老师: 实验题目:学生通讯录管理系统 学号: 姓名: 上机时间:

(一) 需求分析 1、输入的形式和输入值的范围: 根据题目要求与提示,先选择你要使用的表达式形式(中缀用1,后缀用0),在输入一个中缀表达式,输入数的范围为int型,此时,程序将计算出表达式的结果。 2、输出的形式: 当按照程序要求选择了1或0之后,再输入表达式;如果选择的是1,则程序将自动运算出表达式结果;如果之前选择的是0,则程序将现将中缀表达式转化为后缀表达式并计算出结果。 3、程序所能达到的功能: 本程序能计算出含+、-、*、/、(、)等运算符的简单运算。 4、测试数据: 输入一个表达式,如果你之前选择的是“中缀表达式”,那么输入5*(4-2)#,那么输出结果是10;如果之前选择的是“后缀表达式”,那么输入5*(4-2)#,那么他将先转换成后缀表达式5 4 2 - * #,再输出结果10。 如果输入表达式没有结束标示符#,如5*(4-2),那将不会输出任何结果,或出现错误结果。 (二) 概要设计 为了实现上述操作,应以栈为存储结构。 1.基本操作: (1). int GetTop(SqStack *s) 初始条件:栈存在; 操作结果:若栈为空,则返回s的栈顶元素;否则返回ERROR。 (2). void Push(SqStack *s,int e) 初始条件:栈存在; 操作结果:插入e为新的栈顶元素。 (3). int Pop(SqStack *s) 初始条件:栈存在; 操作结果:若栈不空,则删除之,并返回其值;否则返回REEOR。 (4).void InitStack(SqStack *s) 初始条件:栈存在; 操作结果:置栈为空。 (5). int Empty(SqStack *s) 初始条件:栈存在; 操作结果:判定s是否为空栈。 (6). int Operate(int a,char theta, int b) 初始条件:操作数a和b存在,且theta是+、-、*、/四则运算; 操作结果:返回a与b间theta运算的结果。 (7). int In(char s,char* TestOp) 初始条件:s为待判断字符,TestOp为已知的算符集合; 操作结果:s为算符集合中的元素则返回1,否则返回0. (8). int ReturnOpOrd(char op,char* TestOp) 初始条件:op为待确定运算符,TestOp为已知的算符集合; 操作结果:确定运算符类型。 (9). char precede(char a, char b)

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

课程设计报告 课程名称数据结构 课题名称中缀算术表达式求值 专业通信工程 班级通信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。 正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现

最常见的前缀和后缀

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

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)//初始化栈

常用前缀和后缀

专升本常用前缀和后缀 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) 遇到括号时:

相关文档
最新文档