中缀表达式转换成前缀中缀后缀表达式式并求值

请将下列中缀表达式f+(a+b)/(d-e)*2转换成后缀表达式, 请将下列中缀表达式f+(a+b)&#47
请将下列中缀表达式f+(a+b)/(d-e)*2转换成后缀表达式
Belmont 请将下列中缀表达式f+(a+b)/(d-e)*2转换成后缀表达式
fab+de-/2*+急问谁有把中缀表达式转化为后缀表达式并求值的C程序_百度知道
急问谁有把中缀表达式转化为后缀表达式并求值的C程序
C程序,用栈谢谢
希望4月32号能得到答案运行的可以的用/**/写备注哈
提问者采纳
#include &stdafx.h& #include &iostream.h& #include &math.h& #include &time.h& #define TRUE 1 #define FALSE 0 #define ERROR -1 typedef int S //用模板实现的链式结构堆栈类 template &class T& class stack{ private: struct link{ T //结点数据域 link * //下一结点指针 link(T Data,link* Next){//结构体构造函数 data=D next=N } }* //堆栈顶指针 public: stack(); //构造函数(初始化栈) ~stack(); //析构函数(销毁栈) void push(T Data); //压栈操作 T gettop() //取栈顶元素 T pop(); //出栈操作 T getvalue(int index); //返回栈底开始第INDEX个栈中值 void traverse(int n); //遍历栈 N个数换行 int empty(); //判断栈是否为空,1是,0非 int sizeofstack(); //返回栈的大小 void clear(); //清空栈 }; //类模板成员函数的实现 template&class T& stack&T&::stack()//构造函数 { head=0; } template&class T& stack&T&::~stack()//析构函数 { link* cursor= while(head) { cursor=cursor-&
head= } } template&class T&void stack&T&::push(T Data)//压栈操作 { head=new link(Data,head); } template&class T&T stack&T&::gettop()const//取栈顶元素 { return head-& } template&class T&T stack&T&::pop()//出栈操作 { if(head==0)return 0; T result=head-& link* oldhead= head=head-&
} template &class T&T stack&T&::getvalue(int index)//返回栈底开始第INDEX个栈中值 { link *cursor= int i=1; int stacklen=sizeofstack(); if(index&=0||index&stacklen)return 0; while(i&=(stacklen-index)) { cursor=cursor-& i++; } return cursor-& } template &class T& void stack&T&::traverse(int n)//遍历栈 { link * cursor= int iEnterSign=1;//换行标识 while(cursor) { cout&&cursor-&data&&& &; if(iEnterSign%n==0)cout&& cursor=cursor-& iEnterSign++; } if((iEnterSign-1)%n!=0)cout&& } template &class T&int stack&T&::empty() //判断栈是否为空,1是,0非 { return head==0?1:0; } template &class T&int stack&T&::sizeofstack() //返回栈的大小 { int size=0; link *cursor= while(cursor) { cursor=cursor-& size++; }
} template&class T& void stack&T&:: clear() //清空栈 { link *cursor= while(cursor&&cursor-&next) { cursor=cursor-&
head= } } int Operator(char ch) { if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#') return(TRUE); else return(FALSE); } char Precede(char ch1,char ch2) {
switch(ch1) { case '+': case '-': { switch(ch2) { case '+': case '-': case ')': case '#': ch='&'; case '*': case '/': case '(': ch='&'; }
} case '*': case '/': { if(ch2=='(') ch='&'; else ch='&';
} case '(': { if(ch2==')') ch='='; else ch='&';
} case ')': { ch='&';
} case '#': { if(ch2=='#') ch='='; else ch='&';
} } return(ch); } int calc(int x,char ch,int y) {
switch(ch) { case '+': z=x+y; case '-': z=x-y; case '*': z=x*y; case '/': z=x/y; } return(z); } int postexpression(char *exp) { stack&int& *opnd=new(stack&int&); char ch=* int x=0,y,z,flag=FALSE;
while(ch!='#') { if(!Operator(ch)) { if(ch!=' ') { x=x*10+(int)(ch)-48; flag=TRUE; } else { if(flag)opnd-&push(x); x=0; flag=FALSE; } } else { x=opnd-&pop(); y=opnd-&pop(); z=calc(y,ch,x); opnd-&push(z); } ch=*(++exp); } result=opnd-&pop(); return(result); } int middexpression(char *exp) { stack&int& *opnd=new(stack&int&); stack&char& *optr=new(stack&char&); char ch=* int x=0,y,z;
optr-&push('#'); while(ch!='#'||optr-&gettop()!='#') { if(!Operator(ch)) { x=x*10+(int)(ch)-48; if(Operator(*(exp+1))) { opnd-&push(x); x=0; } ch=*++ } else { switch(Precede(optr-&gettop(),ch)) { case '&'://栈顶元素优先权低 optr-&push(ch); ch=*++
case '='://脱括号并接收下一字符 optr-&pop(); ch=*++
case '&'://退栈并将运算结果入栈 x=opnd-&pop(); y=opnd-&pop(); z=calc(y,optr-&pop(),x); opnd-&push(z); x=0;
} } } result=opnd-&pop(); return(result); } void main(void)//程序入口函数 { clock_t t1,t2,t3,t4; int i,n=9000; t1=clock(); for(i=0;i&n;i++) postexpression(&100 200 50 3 * - 13 8 - / +#&); //postexpression(&100 200 50 8 45 9 / - - + #&); //postexpression(&9 6 * 3 / 7 + 13 -#&); t2=clock(); printf(&%10f\n&,(t2-t1)/18.2/n); t3=clock(); for(i=0;i&n;i++) middexpression(&100+(200-50*3)/(13-8)#&); //middexpression(&100+(200-(50*(8-45/9)))#&); //middexpression(&9*6/3+7-13#&); t4=clock(); printf(&%10f\n&,(t4-t3)/18.2/n); printf(&%10f&,(t4-t3)/18.2/(t2-t1)*18.2); cin.get();
提问者评价
不是很好...算了
其他类似问题
为您推荐:
中缀表达式的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁中缀表达式转换为后缀表达式并求值c++_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
中缀表达式转换为后缀表达式并求值c++
上传于||文档简介
&&能​提​示​输​入​错​误​信​息​,​能​计​算​包​括​小​数​字​母​等​多​种​运​算
大小:5.06KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢&&&&&&&&&&&
/* * biao.cpp * *
Created on:
Author: allenjin */ #include&iostream&#include&string.h& using namespace
template&class T&
class Stack{
//自定义堆栈公式化描述
Stack(){Top=0;}
T top(){return a[Top];}
void pop(){Top--;}
bool isempty(){
if(Top==0)return true;
return false;}
void push(T b)
a[Top]=b;} private:
T a[100];int T }; void chpost(char inorder[],char post[],int& m)//将中缀表达式转换为后缀表达式,参数m跟踪后缀表达式长度 {
int n=strlen(inorder);//获取中缀表达式的长度
Stack&char&//定义一个char型堆栈用于存放操作符;
for(int i=0;i&n;i++)
if(inorder[i]&='0'&&inorder[i]&='9')//若为操作数,直接添加到后缀表达式数组中
post[m]=inorder[i];
if(inorder[i]=='(')czf.push(inorder[i]);//若为&(&直接压入堆栈
if(inorder[i]=='+')//若为&+&与栈顶比较优先级,较低则将栈顶操作符加到数组中,在将&+&压栈
if(!czf.isempty()&&(czf.top()=='*'||czf.top()=='/'||czf.top()=='-'))
{ post[m++]=czf.top();czf.pop();czf.push(inorder[i]);}
else{czf.push(inorder[i]);}
if(inorder[i]=='-')//若为&-&与栈顶比较优先级,较低则将栈顶操作符加到数组中,将&-&压栈
if(!czf.isempty()&&(czf.top()=='*'||czf.top()=='/'))
post[m++]=czf.top();czf.pop();czf.push(inorder[i]);
}else{czf.push(inorder[i]);}
if(inorder[i]=='*'||inorder[i]=='/')czf.push(inorder[i]);//若为&*&或&/&直接压栈
if(inorder[i]==')')//若遇到&)&将栈中的操作符依次弹出直到遇到&(&结束
while(czf.top()!='(')
{post[m++]=czf.top();czf.pop();}
czf.pop();//弹出&(&
while(!czf.isempty())//将栈中剩余元素依次弹出到后缀表达式数组中
{post[m++]=czf.top();czf.pop();} }int yusuan(char post[],int n)//通过后缀表达式求值{
Stack&int&//定义int型堆栈存放操作数及每次运算结果
int a,b,c,
for(int i=0;i&n;i++){
if(post[i]&='0'&&post[i]&='9')
ss.push((post[i]-'0'));//将char型转为int型
if(post[i]=='-')
b=ss.top();ss.pop();a=ss.top();ss.pop();
c=a-b;ss.push(c);
if(post[i]=='+')
b=ss.top();ss.pop();a=ss.top();ss.pop();
c=a+b;ss.push(c);
if(post[i]=='*')
b=ss.top();ss.pop();a=ss.top();ss.pop();
c=a*b;ss.push(c);
if(post[i]=='/')
b=ss.top();ss.pop();a=ss.top();ss.pop();
c=a/b;ss.push(c);
result=ss.top();//得到最后栈顶元素
ss.pop();//清空栈
return}int main(void) {
char in[100];charint i=0;
cout&&"请输入中缀表达式(#表示结束):";
while(cin&&a)//循环获取输入直到遇到&#&结束
if(a=='#')break;
in[i++]=a;
char po[100];int n=0;
chpost(in,po,n);
cout&&"后缀表达式为:";
for(int j=0;j&n;j++)cout&&po[j]&&"";
cout&&"运算结果为:"&&yusuan(po,n)&&
return 0;}
阅读(...) 评论()

我要回帖

更多关于 中缀表达式直接求值 的文章

 

随机推荐