#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
typedef struct charstack{
char data;
struct charstack *next;
}Node1,*stack1;
typedef struct intstack{
double data;
struct intstack *next;
}Node2,*stack2;
void initchar(stack1 &s);
int popchar(stack1 &s,char &e);
int pushchar(stack1 &s,char e);
int empchar(stack1 s);
int get_char(stack1 s,char &e);
void dischar(stack1 s);
int initint(stack2 &L);
int popint(stack2 &L,double &e);
int pushint(stack2 &L,double e);
int empint(stack2 L);
int int_get(stack2 L,double &e);
double turn(char a);
void trans(char exp[],char tran[]);
double cacul(char exp[]);
int prior(char a[]);
int check(char str[]);
int fuhao(char a[]);
void initchar(stack1 &s)
{
s=NULL;}
int popchar(stack1 &s,char &e){
stack1 p;
p=s;
if(s==NULL){//printf("栈空!\n");
return 0;}
e=s->data;
s=s->next;
delete p;
return 1;
}
int pushchar(stack1 &s,char e){
stack1 p;
p=new Node1;
p->data=e;
p->next=s;
s=p;
return 1;
}
int empchar(stack1 s){
if(s==NULL){//printf("栈空!\n");
return 1;}
else return 0;
}
int get_char(stack1 s,char &e){
if(s==NULL){//printf("栈空!\n");
return 0;}
e=s->data;
return 1;
}
void dischar(stack1 s){
stack1 p;
p=s;
while(p){
printf("%c",p->data);p=p->next;}
}
int initint(stack2 &L){
L=NULL;
return 1;
}
int popint(stack2 &L,double &e){
stack2 p;
if(L==NULL){//printf("栈空!\n");
return 0;}
p=L;
e=L->data;
L=L->next;
delete p;
return 1;
}
int pushint(stack2 &L,double e){
stack2 p;
p=new Node2;
p->data=e;
p->next=L;
L=p;
return 1;
}
int empint(stack2 L){
if(L==NULL){//printf("栈空!\n");
return 1;}
else return 0;
}
int int_get(stack2 L,double &e){
e=L->data;return 1;
}
double turn(char a[]){//字符转化为实数
int i=0,j=0;
double x=0.0,t=0.0;
for(i=0;i<strlen(a);i++){
if(a[i]=='.')break;
x=x*10+a[i]-'0';}
if(a[i]=='.'){
for(j=strlen(a)-1;j>i;j--)
t=(t+a[j]-'0')*0.1;}
return x+t;
}
int prior(char a){//确定符号优先级
if(a=='#') return 1;
if(a=='(') return 2;
if(a=='+'||a=='-') return 3;
if(a=='*'||a=='/') return 4;
else return 0;
}
void trans(char exp[],char tran[]){
int i=0,j=0,n=0;
char c;
stack1 s;
initchar(s);
pushchar(s,'#');
while(exp[n]!='\0')n++;
exp[n]='#';
exp[n+1]='\0';
fuhao(exp);
while(!empchar(s)){
if(exp[i]>='0'&&exp[i]<='9'||exp[i]=='.')
tran[j++]=exp[i];
else{
if(exp[i]!='#')tran[j++]=' ';
switch(exp[i]){
case '(':pushchar(s,'(');break;
case ')':popchar(s,c);
while(c!='('){
tran[j++]=c;popchar(s,c);}break;
default:
while(get_char(s,c)&&prior(c)>=prior(exp[i]))
{if(c!='#')tran[j++]=c;popchar(s,c);}
if(exp[i]!='#')pushchar(s,exp[i]);
}
}i++;
}tran[j]='\0';
}
int fuhao(char a[]){
int i=0,j=0;
char b[100];
if(a[i]=='-')
b[j++]='0';b[j++]='-';i++;
while(a[i]){
if(a[i]=='('&&a[i+1]=='-')
{b[j++]='(';b[j++]='0';b[j++]='-';i=i+2;}
else
b[j++]=a[i++];
}
strcpy(a,b);
return 0;
}
double cacul(char exp[]){
stack2 L;
initint(L);
double t1,t2,t=0;
int i=0,j=0;
char tran[100];
while(exp[i]!='\0'){
if(exp[i]<='9'&&exp[i]>='0'||exp[i]=='.')
{
for(j=0;exp[i]<='9'&&exp[i]>='0'||exp[i]=='.';i++)
tran[j++]=exp[i];
tran[j]='\0';
t=turn(tran);
pushint(L,t);
}
if(exp[i]=='+'||exp[i]=='-'||exp[i]=='*'||exp[i]=='/'){
popint(L,t2);
popint(L,t1);
switch(exp[i]){
case'+':t=t1+t2;pushint(L,t);break;
case'-':t=t1-t2;pushint(L,t);break;
case'*':t=t1*t2;pushint(L,t);break;
case'/':t=t1/t2;pushint(L,t);break;
}
}
i++;i++;
}
popint(L,t);
return t;
}
int check(char str[]){//检查括号匹配
stack1 t;
initchar(t);
int i=0,flag=1;
char c;
while(str[i]){
switch(str[i]){
case '(':pushchar(t,'(');i++;break;
case ')':get_char(t,c);
if(!empchar(t)&&c=='(')popchar(t,c);
else flag=0;
i++;break;
}
}
if(empchar(t)&&flag==1)return 1;
else return 0;
}
int main(void)
{
char *exp,*tran,*str;
exp=new char[100];
tran=new char[100];
str=new char[100];
int j=0,i;
double result;
printf("请输入表达式:\n");
scanf("%s",exp);
for(i=0;exp[i]!='\0';i++)
{
if(exp[i]=='('||exp[i]==')')
str[j++]=exp[i];
}str[j]='\0';
if(check(str)){
trans(exp,tran);
printf("后缀表达式:%s\n",tran);
result=cacul(tran);
printf("计算结果为:%f\n",result);
}
else
printf("括号匹配错误!\n");return 0;
}
任意实数后缀表达式求值(链栈)
最新推荐文章于 2021-03-16 19:51:44 发布