复杂计算(带括号)含有中缀表达式转换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
试编写程序,
a.将中缀表达式计算转换成后缀表达式。
b. 后缀表达式的计算实现4.2.2中的算法,要考虑实际运算时,后缀表达式中相邻操作数的界定。
#include
#include
#include
#include
using namespace std;
#define max 100
typedef char elemtype;
typedef struct node
{
elemtype data;
struct node *next;
}listack;
void initstack(listack *&s)
{
s=(listack*)malloc(sizeof(listack));
s->next=NULL;
}
int stacklength(listack *s)
{
int i=0;
listack *p;
p=s->next;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}
void clearstack(listack *s)
{
listack *p=s->next;
while(p!=NULL)
{
free(s);
s=p;
p=p->next;
}
}
int stackempty(listack *s)
{
return(s->next==NULL);
}
void push(listack *& s,elemtype e) {
listack *p;
p=(listack*)malloc(sizeof(listack)); p->data=e;
p->next=s->next;
s->next=p;
}
int pop(listack *&s,elemtype &e) {
listack *p;
if(s->next==NULL)
return 0;
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return 1;
}
int gettop(listack *s,elemtype &e) {
if(s->next==NULL)
return 0;
e=s->next->data;
return 1;
}
void caculator(listack *&s)
{
if(stackempty(s))
return ;
listack *sq;
initstack(sq);
elemtype e,e1,e2;
e1=e2='0';
int sum=0;
while(!stackempty(s))
{
pop(s,e);
int i=e-'0';
if(i<=9&&i>=0)
push(sq,e);
else
{
switch(e)
{
case'+':{
pop(sq,e1);
pop(sq,e2);
sum=(e2-'0')+(e1-'0');
e=sum+'0';
push(sq,e);
}
break;
case'-':{
pop(sq,e1);
pop(sq,e2);
sum=(e2-'0')-(e1-'0');
e=sum+'0';
push(sq,e);
}
break;
case'*':{
pop(sq,e1);
pop(sq,e2);
sum=(e2-'0')*(e1-'0');
e=sum+'0';
push(sq,e);
}
break;
case'/':{
pop(sq,e1);
pop(sq,e2);
if(e1-'0'==0){
printf("除表达式不是后缀表达式!/n");
return;
}
sum=(e2-'0')/(e1-'0');
e=sum+'0';
push(sq,e);
}
break;
}
}
}
pop(sq,e);
printf("结果:");
int x=e-'0';
cout< } int prinum(elemtype e) { int i=-1; if(e=='+'||e=='-') i=0; if(e=='*'||e=='/') i=1; return i; } void main() { listack *s,*q,*p; char t[max]; cout<<"输入表达式:"< scanf("%s",t); elemtype e; initstack(s);initstack(q);initstack(p); int i=0; while(t[i]!=0) { if(t[i]=='(') push(s,t[i]); else if(t[i]==')') { while(!stackempty(s)) { pop(s,e); if(e=='(') break; else { push(q,e); printf("%c",e); } } if(e!='(') {printf("输入有误!/n"); return; } } else if(t[i]=='+'||t[i]=='-'||t[i]=='*'||t[i]=='/') { if(stackempty(s)) push(s,t[i]);