#include<stdio.h>
#include<malloc.h>
#include<iostream>
using namespace std;
#define MAXSize 10000
struct
{
char data;
int n;
}nei[]={{'=',0},{'(',1},{'+',3},{'-',3},{'*',5},{'/',5},{')',6}},
wai[]={{'=',0},{'(',6},{'+',2},{'-',2},{'*',4},{'/',4},{')',1}};
struct sqstack
{
char data;
struct sqstack *next;
};
void initstack(struct sqstack* &);
void push(struct sqstack* &,struct sqstack *,struct sqstack *);
void jisuan(struct sqstack *);
int waishu(char );
int main()
{
struct sqstack *L1,*L,*L2;
int i,n;
initstack(L);
initstack(L1);
initstack(L2);
scanf("%d",&n);
for(i=0;i<n;i++)
{
L->next=NULL;
push(L,L1,L2);
jisuan(L);
if(i!=n-1)printf("\n");
}
return 0;
}
void initstack(struct sqstack* &L)
{
L=new sqstack;
L->next=NULL;
}
int neishu(char c)
{
int i=0;
for(i=0;i<7;i++)
{
if(nei[i].data==c)
return nei[i].n;
}
}
int waishu(char c)
{
int i=0;
for(i=0;i<7;i++)
{
if(wai[i].data==c)
return wai[i].n;
}
}
void push(struct sqstack* &L,struct sqstack *L1,struct sqstack *L2)
{
struct sqstack *newnode=NULL,*p=NULL,*q=NULL;
char a[MAXSize];
int i=0,n=0;
cin>>a;
newnode=new sqstack;
newnode->data='=';
newnode->next=L1;
L1=newnode;
while(1)
{
if(a[i]!='('&&a[i]!='+'&&a[i]!='-'&&a[i]!='*'&&a[i]!='/'&&a[i]!=')'&&a[i]!='(')
{
while(a[i]>='0'&&a[i]<='9')
{
newnode=new sqstack;
newnode->data=a[i];
newnode->next=L2;
L2=newnode;
i++;
}
newnode=new sqstack;
newnode->data='#';
newnode->next=L2;
L2=newnode;
}
while(1)
{
if(neishu(L1->data)>waishu(a[i]))
{
p=L1;
L1=L1->next;
p->next=L2;
L2=p;
break;
}
if(neishu(L1->data)<waishu(a[i]))
{
if(a[i]=='\0')
{
while(L1->data!='=')
{
p=L1;
L1=L1->next;
p->next=L2;
L2=p;
}break;
}
else
{
newnode=new sqstack;
newnode->data=a[i];
newnode->next=L1;
L1=newnode;
}
i++;
break;
}
if(neishu(L1->data)==waishu(a[i]))
{
p=L1;
L1=L1->next;
delete p;
i++;
}
if(L1->data=='=')break;
}
if(a[i]=='\0')break;
}
while(L2->next!=NULL)
{
p=L2;
L2=L2->next;
p->next=L;
L=p;
}
}
void jisuan(struct sqstack *L)
{
struct sqstack *p;
int i=0,j=0,k=0,m=0,n=0,a[MAXSize];
while(L->next!=NULL)
{
switch(L->data)
{
case '+':
a[j-2]=a[j-1]+a[j-2];j--;break;
case '-':
a[j-2]=a[j-2]+a[j-1];j--;break;
case '*':
a[j-2]=a[j-1]*a[j-2];j--;break;
case '/':
a[j-2]=a[j-2]/a[j-1];j--;break;
default:
if(L->data!='#')
i=i*10+(L->data-48);
else
{
a[j]=i;
i=0;
j++;
}
break;
}
p=L;
L=L->next;
delete p;
}
printf("%d",a[j-1]);
}
测试数据
3
3+5*8
(3+5)*8
(23+34*45/(5+6+7))