算术表达式求值演示
求各位高手帮帮忙啊!!!问题描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用中缀表达式变为后缀表达式并对后缀表达式求值的...
求各位高手帮帮忙啊!!!问题描述:表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用中缀表达式变为后缀表达式并对后缀表达式求值的过程。
基本要求:以字符序列的方式从终端输入语法正确的、不含变量的整数表达式。利用中缀表达式变为后缀表达式和后缀表达式求值算法实现对算术四则混合运算表达式的求值,并演示出在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。 展开
基本要求:以字符序列的方式从终端输入语法正确的、不含变量的整数表达式。利用中缀表达式变为后缀表达式和后缀表达式求值算法实现对算术四则混合运算表达式的求值,并演示出在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。 展开
1个回答
2013-08-31
展开全部
#include <iostream>
#include <stack>using namespace std; int Operate(int x,char op,int y) //四则运算符的运算定义
{
switch(op){
case'+': return x+y;
case'-': return x-y;
case'*': return x*y;
case'/': return x/y;
}
}
char Precede(char op1,char op2) //判断符号的优先级
{
if(((op1=='+'||op1=='-')&&(op2=='+'||op2=='-'||op2==')'||op2=='#'))||((op1=='*'||op1=='/')&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='#')))
return '>';
if((op1=='('&&op2==')')||(op1=='#'&&op2=='#'))
return '=';
else
return '<';
}
void Tonumber(char &c,stack<int> &OPND) //转化为数字
{ int number=0; if(((c-'0')>=0&&(c-'0')<=9))
{
while(((c-'0')>=0&&(c-'0')<=9))
{
number=number*10+(c-'0');
cin>>c;
}
OPND.push(number);
}
}int main()
{
stack<char> OPTR;
stack<int> OPND;//设OPTR和OPND分别为运算符栈和运算数栈
OPTR.push('#'); //出栈时的结尾判断
char c,op1,op2,op;
int x,y,temp=1;
cout<<"输入表达式,以'#'结束:";
cin>>c;
while(c!='#'||OPTR.top()!='#')
{
Tonumber(c,OPND);
if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='('&&c!=')'&&c!='#')
{
OPND.push(c);
cin>>c;
}
else
{
op1=OPTR.top();
op2=c;
switch(Precede(op1,op2))
{
case '<': //栈顶元素优先级低
OPTR.push(c);
cin>>c;
break;
case '=': //脱括号并接受下一个字符
OPTR.pop();
cin>>c;
break;
case '>': op=OPTR.top(); //退栈并将运算结果入栈
OPTR.pop();
x=OPND.top();
OPND.pop();
y=OPND.top();
OPND.pop();
OPND.push(Operate(y,op,x));
int a=OPND.top();
break;
}
}
}
cout<<"计算结果是:"<<OPND.top()<<endl;
return 0;
}
#include <stack>using namespace std; int Operate(int x,char op,int y) //四则运算符的运算定义
{
switch(op){
case'+': return x+y;
case'-': return x-y;
case'*': return x*y;
case'/': return x/y;
}
}
char Precede(char op1,char op2) //判断符号的优先级
{
if(((op1=='+'||op1=='-')&&(op2=='+'||op2=='-'||op2==')'||op2=='#'))||((op1=='*'||op1=='/')&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='#')))
return '>';
if((op1=='('&&op2==')')||(op1=='#'&&op2=='#'))
return '=';
else
return '<';
}
void Tonumber(char &c,stack<int> &OPND) //转化为数字
{ int number=0; if(((c-'0')>=0&&(c-'0')<=9))
{
while(((c-'0')>=0&&(c-'0')<=9))
{
number=number*10+(c-'0');
cin>>c;
}
OPND.push(number);
}
}int main()
{
stack<char> OPTR;
stack<int> OPND;//设OPTR和OPND分别为运算符栈和运算数栈
OPTR.push('#'); //出栈时的结尾判断
char c,op1,op2,op;
int x,y,temp=1;
cout<<"输入表达式,以'#'结束:";
cin>>c;
while(c!='#'||OPTR.top()!='#')
{
Tonumber(c,OPND);
if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='('&&c!=')'&&c!='#')
{
OPND.push(c);
cin>>c;
}
else
{
op1=OPTR.top();
op2=c;
switch(Precede(op1,op2))
{
case '<': //栈顶元素优先级低
OPTR.push(c);
cin>>c;
break;
case '=': //脱括号并接受下一个字符
OPTR.pop();
cin>>c;
break;
case '>': op=OPTR.top(); //退栈并将运算结果入栈
OPTR.pop();
x=OPND.top();
OPND.pop();
y=OPND.top();
OPND.pop();
OPND.push(Operate(y,op,x));
int a=OPND.top();
break;
}
}
}
cout<<"计算结果是:"<<OPND.top()<<endl;
return 0;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询